Функции быстрого управления Bash довольно статичны. Если вы хотите больше контроля, вы можете включить переменные в ваше приглашение; убедитесь, что вы не отключили эту promptvarsопцию .
PS1='${PWD#"${PWD%/*/*}/"} \$ '
Обратите внимание на одинарные кавычки: раскрытие переменных должно происходить во время отображения приглашения, а не во время определения PS1переменной.
Если вы хотите больше контроля над тем, что отображается, вы можете использовать подстановки команд. Например, приведенный выше фрагмент теряет ~сокращение для домашнего каталога.
PS1='$(case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac; printf %s "$HPWD") \$ '
Этот код довольно громоздок, поэтому вместо того, чтобы вставлять его в PS1переменную, вы можете использовать PROMPT_COMMANDпеременную для запуска кода, чтобы установить HPWDи затем использовать его в своем приглашении.
PROMPT_COMMAND='case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac'
PS1='$HPWD \$'
Поскольку сокращенная подсказка изменялась только при смене каталога, вам не нужно пересчитывать ее каждый раз, когда отображается подсказка. Bash не предоставляет ловушку, которая запускается при текущем изменении каталога, но вы можете имитировать его , переопределяя cdи его кузенов.
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 \$'
Обратите внимание, что вам не нужно и не нужно экспортировать PS1, так как это параметр оболочки, а не переменная окружения. PS1Настройка bash не будет понята другими оболочками.
PS Если вы хотите получить приятную интерактивную оболочку, переключитесь на zsh , где все они (быстрые %расширения, в основном включающие tcsh и chpwdт. Д.) Являются встроенными функциями.
PS1='%2~ %# '
PS1='\w \$'; PROMPT_DIRTRIM=2должен дать вам эквивалент bash, но он не работает должным образом в моей системе.