1

В Bash каталог ~ имеет особый статус, поскольку, если текущий каталог находится в ~ , он автоматически сокращается. То есть dirs +0 и атом замены \w в PS1 показывает

$ dirs +0
~/test/directory

Вместо /home/myname/test/directory .

Можно ли присвоить другому каталогу такой особый статус? Я часто работаю в дереве исходников, где верхним уровнем является $DEV или $SRC , и я хотел бы показать текущий каталог в PS1 как

$SRC/current/working/directory

вместо (например)

~/projects/devel/source/current/working/directory

1 ответ1

3

Если $ 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 \$ '

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .