Di tcsh, saya memiliki default:
prompt [%m:%c3] %n%#
yang memberikan prompt seperti:
[woehler:hacking/c/hello] ajcarr%
dan
[woehler:~] ajcarr%
Dengan kata lain, direktori saat ini dan hingga dua berikutnya di atasnya di jalur.
Di ksh93 atau bash, penggantian $HOME
oleh ~
mudah, seperti mengekstrak nama hanya direktori saat ini, tetapi saya belum menemukan cara untuk mereplikasi %c3
perilaku tcsh. Saat ini di ksh93 saya memiliki:
[[email protected]] hello $
dan
[[email protected]] ~ $
Adakah yang punya saran tentang cara melakukan ini?
Jawaban yang Diterima:
Dalam ksh93
:
PS1='${PWD#${PWD%?/*/*/*}?/} $ '
share/doc/libnl-3-dev $ _
PS1='[${HOSTNAME%%.*}:${PWD#${PWD%?/*/*/*}?/}] $USER% '
[host:share/doc/libnl-3-dev] user% _
Kalau mau ganti juga $HOME
dengan ~
, diperlukan sesuatu yang lebih jahat:
PS1='$(d=${PWD/#$HOME/"~"};printf %s "${d#${d%?/*/*/*}?/}") $ '
~/w/maemo $ cd sb2-pathmaps
w/maemo/sb2-pathmaps $ _
PS1='$(d=${PWD/#$HOME/"~"};printf %s "[${HOSTNAME%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '
[host:w/maemo/sb2-pathmaps] user% _
Semua ini juga harus bekerja di bash
, meskipun bash
memiliki prompt escape sendiri (mis. h
untuk ${HOSTNAME%%.*}
) dan mekanisme pemendekan jalur (dengan PROMPT_DIRTRIM
).
Juga, varian yang lebih jahat akan sangat buruk, karena bash
, tidak seperti ksh93
, akan fork()
proses terpisah untuk setiap $(...; printf ...)
substitusi perintah, meskipun hanya berisi bawaan. Ini juga berlaku untuk pdksh
shell turunan, seperti mksh
.
zsh
memiliki prompt lolos sangat mirip tetapi tidak identik dengan tcsh
:
zsh$ PS1='[%m:%3c] %n%# '
[host:share/doc/libnl-3-dev] user% _
Catatan:
$HOSTNAME
variabel tidak disetel secara default di ksh93
; alih-alih, Anda dapat menggunakan uname
builtin (setelah mengaktifkannya dengan PATH=/opt/ast/bin:$PATH
; /opt/ast/bin
jalur tidak perlu ada):
PS1='$(d=${PWD/#$HOME/"~"};h=$(uname -n); printf %s "[${h%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '
Berbeda dengan h
melarikan diri di bash atau %m
melarikan diri di zsh
atau tcsh
ini akan lacak perubahan nama host.