Чому мій запит на 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
Щиро дякую за те, що задали саме це запитання (і, звичайно, гікозавру за його відповідь)! Я розмахував цілими ГОДИНАМИ, намагаючись зрозуміти, чому мій запит оновлював свій рядок стану 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
У цьому випадку потрібно замінити змінні кольору, я думаю - принаймні, я просто отримую екранні коди з пропозицією @ 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

Так, так. Його краще - я скучив за місцевими варіантами кольорів. Дякую за голосування. :)
Mike Seplowitz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.