在
Cygwin
和几乎所有其他 *nix 中,我多年来一直在我的 .bashrc
中使用以下代码。
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
PS1='${debian_chroot:+($debian_chroot)}\[\033[00;32m\]\u@\h\[\033[00m\] \[\033[00;33m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\] \n\$ '
在 git 文件夹中时会生成彩色提示。
# xxxx@LAPTOP /cygdrive/c/dev/some_git_repo (master)
但是,在 MINGW64、MSYS、UCRT64 中尝试相同的操作都失败,无法注入
parse_git_branch
结果。那些 shell 似乎只是拒绝执行该函数。很明显,MSYS 开发人员在这里做了一些奇怪的事情。 (我还注意到解释单引号和双引号还有其他奇怪的地方。)
我也尝试过:
# PS1='\[\e]00;\w\a\]\n\[\e[00;32m\]\u@\h \[\e[00;35m\]$MSYSTEM\[\e[00m\] \[\e[00;33m\]\w\[\e[01;31m\] $(parse_git_branch)\[\e[00m\] \n\$ '
# Error:
# -bash: command substitution: line 1: syntax error near unexpected token `)'
# -bash: command substitution: line 1: `parse_git_branch)'
问:如何在这些 shell 中恢复显示我所在的 git 分支?
太疯狂了,尝试使用老式的反勾号 [`] 而不是
$(command)
,成功了!
解决方案是使用单引号和反引号命令替换。
PS1='\[\e]00;\w\a\]\n\[\e[00;32m\]\u@\h \[\e[00;35m\]$MSYSTEM\[\e[00m\] \[\e[00;33m\]\w\[\e[01;31m\] `parse_git_branch`\[\e[00m\] \n\$ '