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

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

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

/parent/currentdir $

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

set prompt = "%C2 %"

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

Нет ли более простого способа, например:

export PS1="$(some_command) $" 
10 голосов | спросил twalbaum 18 J000000Saturday15 2015, 23:11:05

2 ответа


12

функции быстрого управления - это скорее статичный. Если вы хотите больше контроля, вы можете включить переменные в свой запрос; убедитесь, что вы не отключили 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 variable , чтобы запустить код для установки 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 "[email protected]" && chpwd; }
pushd () { builtin pushd "[email protected]" && chpwd; }
popd () { builtin popd "[email protected]" && 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 не будет понято другими оболочками.

P.S. Если вам нужна приятная интерактивная оболочка, перейдите на zsh , где все они (prompt %, в основном охватывающие tcsh, chpwd и т. Д.) Являются родными особенности.

PS1='%2~ %# '
ответил Gilles 20 J000000Monday15 2015, 02:28:21
2

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

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

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

prompt_command () {
    PS1='$(basename $(dirname "$PWD"))/$(basename "$PWD") $ '
}
PROMPT_COMMAND=prompt_command
ответил twalbaum 20 J000000Monday15 2015, 01:01:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132