Почему моя подсказка 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)файл не кэширован?


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

О да. Его лучше - я пропустил местные вары по цвету. В любом случае спасибо за голосование. :)
— Майк Сепловиц
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.