bash 提示中的 __git_ps1(当前分支)总是以某种方式过时

jco*_*lum 8 bash prompt

PS1在我的~/.bash_profile

export PS1="\\n\[\033[38;5;246m\]\u@\[\033[38;5;245m\]\h\[\033[38;5;15m\] \[\033[38;5;28m\]\w\[\033[38;5;15m\]\[\033[38;5;2m\]`__git_ps1`\[\033[38;5;15m\] \[\033[38;5;90m\]\t\[\033[38;5;15m\] \[\033[38;5;232m\]\[\033[38;5;15m\] \n\[\033[38;5;0m\]\\$ "
Run Code Online (Sandbox Code Playgroud)

(抱歉,我的颜色代码没有任何别名,我使用在线编辑器创建了此提示)

这有点乱,但会产生一个非常好的提示: 在此处输入图片说明

但是如果我切换,显示的当前分支总是错误的

错误的分支

我不确定为什么会发生这种情况。如果我自己运行命令,我会得到正确的值。

$ echo `__git_ps1`
(dev)
Run Code Online (Sandbox Code Playgroud)

如果我获取 .bash_profile ,新值就会出现(但下次我切换时会出错)。难道我做错了什么?

Gil*_*il' 9

export PS1="…`__git_ps1`…"
Run Code Online (Sandbox Code Playgroud)

使用`__git_ps1`双引号,此命令运行命令__git_ps1并将其输出(和其他周围文本)分配给变量PS1。因此,您的提示显示了.bash_profile在执行时确定的分支。

__git_ps1每次 bash 显示提示时,您都需要运行。(实际上,在 git 信息更改之前,您不需要再次运行它,但这很难检测到。)有两种方法可以做到这一点。

顺便说一下,提示是一个 shell 配置,而不是一个全局设置,所以你应该在 中设置它~/.bashrc,而不是在~/.bash_profile.


小智 5

这只是一个简单的引用问题。更改`__git_ps1`\$(__git_ps1), 或者,如果您必须使用反引号:\`__git_ps1\`

为了说服自己,只需将您的 PS1 更改为(如果您想完全恢复到以前的设置,请打开一个新的 shell 实例):

$ PS1="$(date) >"
Thu Nov 26 20:02:34 EST 2015 >_
Run Code Online (Sandbox Code Playgroud)

唯一的问题是它不会更新(等待几秒钟按回车键)。

但这将:

$ PS1="\$(date) >"
Thu Nov 26 20:06:20 EST 2015
Thu Nov 26 20:06:25 EST 2015
Run Code Online (Sandbox Code Playgroud)

就这样。写exit。(更新您的提示)回去工作。