Почему моя подсказка bash не обновляется?

83

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

RESET="\[\017\]"
NORMAL="\[\033[0m\]"
RED="\[\033[31;1m\]"
YELLOW="\[\033[33;1m\]"
WHITE="\[\033[37;1m\]"
SMILEY="${WHITE}:)${NORMAL}"
FROWNY="${RED}:(${NORMAL}"
SELECT="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else echo \"${FROWNY}\"; fi"

export PS1="${RESET}${YELLOW}\u@\h${NORMAL} \`${SELECT}\` ${YELLOW}\w $(__git_ps1) >${NORMAL} "

Я попробовал ( .bashrcснова выполнив поиск своего файла), и, похоже, он работал, но затем я пошел в другую ветку, и она не обновилась. Как я могу убедиться, что $(__git_ps1)файл не кэширован?

greg0ire
источник
14
Мне нравится идея иметь :)и :(в вашем приглашении в зависимости от того, не удалась ли последняя команда :)
Марк Лонгэр
@Mark Longair: Я нашел его здесь: serverfault.com/questions/4889/… Кстати, почему вы удалили свое решение, оно тоже работает!
greg0ire
он был на несколько минут позже, чем два других, и в любом случае менее изящен, чем у @ geekosaur
Марк Лонгэр
1
Большое спасибо за то, что задали именно этот вопрос (и, конечно же, geekosaur за его ответ)! Я часами копался, пытаясь понять, почему мое приглашение обновляло только строку состояния git, когда я получал свой файл .bashrc.
coredumperror

Ответы:

132

Вам понадобится обратная косая черта, $чтобы она не расширялась сразу. (Сравните с `...`, это другой способ написания $(...).)

export PS1="${RESET}${YELLOW}\u@\h${NORMAL} \`${SELECT}\` ${YELLOW}\w \$(__git_ps1) >${NORMAL} "

Я бы согласился с @MikeSep насчет использования одинарных кавычек, но на самом деле более оптимально позволить сразу же заменять цвета и тому подобное. Не обязательно, просто лучше. Тем не менее, это является легче понять , что происходит , если вы используете одинарные кавычки.

гикозавр
источник
2
Кроме того, если вы когда-либо работали напрямую не с терминальными программами (буферы команд Emacs / Vim screenи т. Д.), Вам может потребоваться рассмотреть возможность использования tputвместо жестко запрограммированных цветовых переходов.
geekosaur
1
Я думаю, в этом случае необходимо заменить переменные цвета - по крайней мере, я просто получаю escape-коды с предложением @MikeSep, тогда как ваш работает нормально. (+1)
Марк Лонгэр
@Mark: Это интересно; ${SELECT}один показывает , что рекурсивная оценка делается. Может это только для команд? Вместо этого я обычно использую функцию PS1, потому что так легче понять, что происходит.
geekosaur
Спасибо @geekosaur
smonff
3
человек, ты спаситель жизни. Однако у меня есть вопрос: у меня есть MBP и iMac. Тот же .bash_profile, та же версия bash (устанавливается через homebrew). на MBP, если я не добавлю \ перед знаком $(__git_ps1), он не будет оцениваться. Если я сделаю то же самое на iMac, он будет оценен даже без символа \. Есть идеи, как это может случиться?
molli
24

Ваша PS1строка, вероятно, оценивается перед сохранением, но вы действительно хотите, чтобы __git_ps1команда запускалась каждый раз, когда вы получаете командную строку. Я бы рекомендовал использовать одинарные кавычки вместо двойных кавычек для вашей export PS1='${RESET}...'строки.

Майк Сепловиц
источник
может работать, но у меня проблемы с преобразованием всей системы в одинарные кавычки, поэтому я воспользуюсь решением geekosaur. Но ты тоже получил мой голос.
greg0ire
О да. Его лучше - я пропустил местные вары по цвету. В любом случае спасибо за голосование. :)
Майк Сепловиц