$?
- это состояние выхода «последнего выполненного переднего конвейера». Поскольку вы всегда (успешно) запускаете git_branch
прямо перед highlightExitCode
, $?
всегда равен 0
. Ваше поведение примерно следующее:
$ exitcode() { (($? == 0)) && echo ":)" || echo ":("; }
$ PS1='$(exitcode) \$ '
:) $ false
:( $ true
:) $
, но с дополнительной командой как часть PS1
.
Для этого вы можете сделать следующее:
Создайте эти три функции, например, как часть вашего ~/.bashrc
:
git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
smiley() {
(($1 == 0)) && echo ':)' || echo ':('
}
set_prompt() {
local exitstatus=$?
PS1='$(git_branch) '"$(smiley "$exitstatus")"' \$ '
}
Установите для переменной среды PROMPT_COMMAND
значение set_prompt
(возможно, также в ~/.bashrc
)
Теперь у вас есть приглашение, которое ведет себя следующим образом:
(master) :) $ false
(master) :( $ true
(master) :) $
Основной трюк - сохранить статус выхода, который определяет поведение смайлика, прежде чем делать что-либо еще.
Кроме того, более чистый способ получения названия текущей ветви -
git symbolic-ref -q --short HEAD 2>/dev/null