Если $ PS1 содержит расширения буквальных переменных, они будут лениво раскрываться каждый раз, когда отображается приглашение. Таким образом, прямой метод, использующий только одну подстановку, заключается в использовании ${var/#search/replacement}
для замены одного префикса на другой:
PS1='\u@\h ${PWD/#"${SRC:-xxx}"/"\$SRC"} \$ '
Обратите внимание, что в назначении используются одинарные кавычки, поэтому расширение ${PWD...}
включено дословно, но не раскрывается во время назначения. (Расширение Lazy PS1 по умолчанию выполняется в bash, но также возможно в zsh, если вы знаете, какую опцию включить. Я не.)
Использование ${SRC:-xxx}
вместо просто $SRC
является глупой гарантией того, что $ SRC будет пустым или неустановленным, и в этом случае вы получите префикс везде, а не нигде.
Немного более сложный метод - вызвать пользовательскую функцию и дать ей сгенерировать желаемый результат:
show_abbrevd_path() {
# longest prefix should be first
case $PWD in
"$SRC/"*) echo "${PWD/#"$SRC/"/"\$SRC/"}";;
"$HOME/"*) echo "${PWD/#"$HOME/"/"~/"}";;
*) echo "$PWD";;
esac
}
PS1='\u@\h $(show_abbrevd_path) \$ '
(Не сторона: кавычки в "${PWD/#"$SRC/"/"\$SRC/"}"
на самом деле являются вложенными и не закрываются / повторно открываются. иначе.)
Конечно, это не обязательно должна быть функция - вы также можете использовать $(pwd | sed ...)
или $(perl ...)
или $(~/bin/fancypwd)
- но чем больше процессов вы создаете , тем больше времени требуется для отображения строки, и оболочка чувствует себя медленнее , как результат.
На этой ноте вы можете получить тот же эффект с нулевыми подпроцессами, вызвав функцию через $ PROMPT_COMMAND и подняв ее глобальное состояние, избегая, таким образом, подоболочки $(…):
make_abbrevd_path() {
case $PWD in
"$SRC/"*) xpwd="${PWD/#"$SRC/"/"\$SRC/"}";;
"$HOME/"*) xpwd="${PWD/#"$HOME/"/"~/"}";;
*) xpwd="$PWD";;
esac
}
PROMPT_COMMAND='make_abbrevd_path'
PS1='\u@\h $xpwd \$ '