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

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

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

/parent/currentdir $ 

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

 set prompt = "%C2 %" 

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

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

 export PS1="$(some_command) $" 

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"' 
  • Частично дублированная история при настройке PS1 в .bash_profile
  • scp с удаленного хоста не удается из-за приветствия входа в систему .bashrc
  • Доступна ли какая-либо специальная информация (например, предыдущая команда) для PROMPT_COMMAND?
  • Отобразить текущий рабочий каталог в терминале
  • Как поместить «клей» CWD (и т. Д.) В часть экрана вместо того, чтобы вставлять в PS1?
  • Проблема с командой promp cycling при использовании цветов и попытке поместить ветви git в командную строку
  • PS1, чтобы показать прошедшее время
  • Изменение подсказки bash в зависимости от того, является ли первый символ пробелом
  • Длина строки режима чтения в приглашении bash
  • Как я могу сократить свое настроенное приглашение PS1?
  • Вызов Bash - backspace удаляет правый выровненный текст (можно остановить?)
  • Linux и Unix - лучшая ОС в мире.