为什么我的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 2011年

@Mark Longair:我在这里找到它:serverfault.com/questions/4889/…顺便说一句,您为什么删除解决方案,它也可以工作!
greg0ire 2011年

它比其他两个都晚了几分钟,而且比@geekosaur的都整齐了
Mark Longair 2011年

1
非常感谢您提出这个确切的问题(当然,也要感谢geekosaur的回答)!我一直在徘徊HOURS,试图弄清楚为什么在我输入.bashrc文件时提示仅更新其git status行。
coredumperror13年

Answers:


132

您需要在上加一个反斜杠,$这样它就不会立即扩展。(与相比`...`,这是另一种写作方式$(...)。)

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

我同意@MikeSep关于使用单引号的说法,但是实际上让颜色立即替换是更好的选择。没必要,只是更好一点。这就是说,它更容易理解发生了什么事情,如果你使用单引号。


2
另外,如果您曾经直接从事终端程序以外的工作(例如Emacs / Vim命令缓冲区screen等),则可能要考虑使用tput替代硬编码的颜色转义符。
geekosaur 2011年

1
在这种情况下,有必要替换颜色变量,我认为-至少,我只是通过@MikeSep的建议获得了转义码,而您的效果很好。(+1)
马克·朗伊尔2011年

@Mark:这很有趣;在${SELECT}一个证明,递归评价正在做。也许仅用于命令?我通常改用PS1函数,因为它更容易弄清发生了什么。
geekosaur 2011年

谢谢@ geekosaur
smonff 2014年

3
男人,你是救命的人。但是我有一个问题:我有一个MBP和一个iMac。相同的.bash_profile,相同版本的bash(通过自制程序安装)。如果我不将MB放在MBP上$(__git_ps1),则不会对其进行评估。如果我在iMac上执行相同的操作,即使没有\,它也会得到评估。知道如何发生吗?
molli 2014年

24

您的PS1字符串可能在保存之前就已经进行了评估,但是您确实希望__git_ps1每次收到命令提示符时都运行该命令。我建议您在export PS1='${RESET}...'一行中使用单引号而不是双引号。


也许可以,但是我在将所有系统转换为单引号时遇到问题,所以我将使用geekosaur的解决方案。但是你也得到我的支持。
greg0ire 2011年

是的。他的更好-我错过了当地的vars颜色。还是谢谢你的投票。:)
Mike Seplowitz 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.