Funkcje szybkiego sterowania Bash są raczej statyczne. Jeśli chcesz mieć większą kontrolę, możesz dołączyć zmienne do swojego monitu; upewnij się, że nie wyłączyłeś tej promptvars
opcji .
PS1='${PWD#"${PWD%/*/*}/"} \$ '
Zwróć uwagę na pojedyncze cudzysłowy: rozwinięcie zmiennej musi nastąpić w momencie wyświetlenia monitu, a nie w momencie PS1
definiowania zmiennej.
Jeśli chcesz mieć większą kontrolę nad tym, co jest wyświetlane, możesz użyć zastępowania poleceń. Na przykład powyższy fragment ~
kodu traci skrót do katalogu domowego.
PS1='$(case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac; printf %s "$HPWD") \$ '
Ten kod jest raczej kłopotliwy, więc zamiast wtykać go w PS1
zmienną, możesz użyć tej PROMPT_COMMAND
zmiennej do uruchomienia kodu, aby ustawić, HPWD
a następnie użyć go w wierszu polecenia.
PROMPT_COMMAND='case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac'
PS1='$HPWD \$'
Ponieważ skrócony monit zmienił się tylko przy zmianie katalogu, nie trzeba go ponownie obliczać za każdym razem, gdy wyświetlany jest monit. Bash nie zapewnia przechwytywania, które działa na bieżącej zmianie katalogu, ale możesz to zasymulować, zastępując cd
i jego kuzynów.
cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac
}
PS1='$HPWD \$'
Zauważ, że nie musisz i nie powinieneś eksportować PS1
, ponieważ jest to ustawienie powłoki, a nie zmienna środowiskowa. PS1
Ustawienie bash nie byłoby zrozumiałe dla innych powłok.
PS Jeśli chcesz miłej interaktywnej powłoki, przełącz się na zsh , gdzie wszystkie z nich (szybkie %
rozszerzenia w dużej mierze obejmujące tcsh chpwd
itp.) Są natywnymi funkcjami.
PS1='%2~ %# '
PS1='\w \$'; PROMPT_DIRTRIM=2
powinien dać ci odpowiednik bash, ale to nie działa poprawnie w moim systemie.