Показывать только текущий и родительский каталог в приглашении bash

Я новичок в bash и хотел бы, чтобы мое приглашение показывало что-то, что в tcsh было тривиально, но после хорошего поиска Google я все равно не могу этого сделать.

Я хотел бы, чтобы мой запрос включал только текущие и родительские каталоги, подобные этому:

/parent/currentdir $ 

В tcsh это достигается путем:

 set prompt = "%C2 %" 

Однако в bash до сих пор я только обнаружил, что мне приходится разбирать pwd, чтобы получить тот же результат.

Разве нет более простого способа, как делать:

 export PS1="$(some_command) $" 

  • Вызов Bash: использование \ в PROMPT_COMMAND
  • подходят столбцы вывода к выходной ширине
  • Пользовательское приглашение bash - проблема позиционирования курсора
  • Вызов Bash, который не будет сжимать длинные команды
  • Как настроить подсказку bash на centos?
  • Как я могу сократить свое настроенное приглашение PS1?
  • Поднял мой подсказку, что случилось?
  • X изменяет переменные окружения?
  • 5 Solutions collect form web for “Показывать только текущий и родительский каталог в приглашении bash”

    Функции быстрого управления 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 и не следует экспортировать, поскольку это параметр оболочки, а не переменная среды. Настройка bash PS1 не будет понята другими оболочками.

    PS Если вам нужна приятная интерактивная оболочка, переключитесь на zsh , где все из них (приглашение % расширения, в основном охватывающее tcsh's, chpwd и т. Д.) Являются собственными функциями.

     PS1='%2~ %# ' 

    Синтаксис для получения родительского и текущего каталогов берется из ответа Мунаи.

    Однако, как отметил Жиль, этот код показывает только текущий каталог на момент загрузки .bashrc , но при перемещении системы в другие папки он не изменится.

    Имея это в вашем файле .bashrc вы автоматически обновляете приглашение в ваш текущий каталог:

     prompt_command () { PS1='$(basename $(dirname "$PWD"))/$(basename "$PWD") $ ' } PROMPT_COMMAND=prompt_command 

    Строку запроса можно легко изменить в bash , отредактировав переменную оболочки PS1 . Он обозначает строку подсказки 1. Больше информации здесь .

    Теперь запустите свою оболочку bash .

    vi ~/.bashrc

    Добавить определение PS1 в файл

     `export PS1="$(basename $(dirname $PWD))/$(basename $PWD)"` 

    Дополнительные уроки здесь и здесь , чтобы помочь вам настроить его еще больше.

    Может быть проще с «~» для домашнего каталога.

     function PWDN { echo "${PWD/#$HOME/~}" | rev | cut -d "/" -f1 -f2 | rev } 
     export PS1='[\u@\h $(basename $(dirname ${PWD}))/$(basename ${PWD})]\$ ' export PROMPT_COMMAND='echo -ne "\033]0;$(basename $(dirname $PWD))/$(basename ${PWD})\007"' 
    Linux и Unix - лучшая ОС в мире.