Переменная оболочки PROMPT_COMMAND не работает должным образом?

Я хочу, чтобы мое приглашение bash менялось в зависимости от внешних условий.

Вот выдержка из руководства bash:

PROMPT_COMMAND: If set, the value is executed as a command prior to issuing each primary prompt.

PS1: The value of this parameter is expanded (see PROMPTING below) and used as the primary prompt string.

В моем .bash_profileу меня есть следующее:

export PROMPT_COMMAND="echo -n ┏━━━[$(date +%H:%M)]"
export PS1="━━[\t]━━━┓\n\$ "

Вот что я вижу в терминале:

┏━━━[03:46]━━[03:46:52]━━━┓
$ cd ..
┏━━━[03:46]━━[03:51:37]━━━┓
$

Как видите, PROMPT_COMMAND не выполняется более одного раза и всегда остается статичным.

Как я могу выполнить его «до выдачи каждого приглашения», как указано в руководстве?

Я использую Mac OS X 10.9.3.
echo $BASH_VERSION
3.2.51(1)-release

Ответы (2)

Запускается PROMPT_COMMANDкаждый раз, но $(...)фрагмент оценивается только при .bash_profileзагрузке. Это связано с тем, что двойные кавычки означают расширение переменных и команд.

Если вы используете одинарные кавычки, команда не подставляется во время выполнения .bash_profile, она оценивается при PROMPT_COMMANDзапуске.

Спасибо. Это работает, как и ожидалось: export PROMPT_COMMAND='echo -n "┏━━━[$(date +%H:%M)]"'
Я только что обнаружил, что можно оценивать код и в PS1 PS1="[\$(date +%H:%M)] \u@\w\ $ ". Это делает PROMPT_COMMAND излишним.
@Sergei Это круто, я собираюсь использовать это. Но для того, что вы делаете (поскольку это строка выше), я бы рекомендовал использовать PROMPT_COMMAND.

Ваш dateвызов был оценен, когда вы установили PROMPT_COMMAND, поэтому он навсегда застрял в то время, когда вы запускали:

export PROMPT_COMMAND="echo -n ┏━━━[$(date +%H:%M)]"

Вместо этого попробуйте определить функцию и назначить ее PROMPT_COMMAND:

function prompt_command() {
    PS1="┏━━━[$(date +%H:%M)]━━[\t]━━━┓\n\$ "
}
export PROMPT_COMMAND=prompt_command

Вы также можете использовать \@текущее время в 12-часовом формате AM/PM в вашей подсказке. Так:

function prompt_command() {
    PS1="┏━━━[\@]━━[\t]━━━┓\n\$ "
}
export PROMPT_COMMAND=prompt_command

Дал бы вам:

┏━━━[06:17 PM]━━[18:17:57]━━━┓
$

И пока мы говорим о настройках bash, позвольте мне добавить отличный проект bash-it — это bash, эквивалентный oh-my-zsh , и он поставляется с кучей вспомогательных функций для создания тем. Возможно, вы обнаружите, что это делает подобные вещи немного проще.

Спасибо! Ваш ответ очень полезен (функция действительно отличная идея!), но я принял первый, потому что он ясно объясняет, что происходит с технической точки зрения. Баш-это золотая жила.
@Сергей, не волнуйся. Вот как это работает здесь. Вы должны выбрать ответ, который, по вашему мнению, лучше всего представляет решение поставленного вопроса!