bash shell 中的 Git 分支名称不会在非 git 目录中消失

bash shell 中的 Git 分支名称不会在非 git 目录中消失

我在用着将 git 分支名称添加到 PS1 变量的指南。我做了一些改动,保留了我当前的提示主题,并为 git 分支名称添加了绿色背景。

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

export PS1="$PS1\e[30;48;5;82m$(parse_git_branch)\e[0m \[\033[00m\]"

看起来一切正常,但是当我离开目录时,git 分支名称仍然存在。如果我在非 git 目录中运行终端,然后 cd 进入 git,我看不到分支的名称。但是当我打开另一个终端选项卡时,我就能看到它了。

我使用带有 Bash shell 的 Guake 终端。

答案1

parse_git_branch发生这种情况是因为您的提示被设置为提示设置时的值,每次运行时您都需要它来运行该函数。

您需要在\前面添加一个$(parse_git_branch),这样当设置提示时美元符号就会被隐藏,因此它不会运行。执行提示时美元符号将可见,并且括号中的命令将运行,从而显示您所在文件夹的正确值。

export PS1="$PS1\e[30;48;5;82m\$(parse_git_branch)\e[0m \[\033[00m\]"

本页第二段的 bash 文档对此进行了解释 http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x279.html

这里的另一个有用的技巧是运行/bin/bash -x并尝试它,这可以向您展示更多正在发生的事情。

答案2

我假设您已将代码段添加到~/.bashrc。这意味着PS1变量仅设置一次,然后在您更改目录时不会更改值。要使其正常工作,PS1需要在每次 之后重新评估的值cd

解决此问题的一种方法是将 设置PROMPT_COMMAND为重置 的函数。在每个 bash 提示符之前都会评估PS1的值(请参阅)。PROMPT_COMMANDman bash

但是,更简单的方法是安装liquidprompt它可以完成您想要的操作,甚至更多。

sudo apt-get install liquidprompt && liquidprompt_activate

然后,您可以根据自己的心意配置动态提示。

相关内容