Git 是否可以在bash';什么是PS1?

Git 是否可以在bash';什么是PS1?,git,bash,Git,Bash,我正在尝试构建一个Bash提示符,它将包含我的git分支信息(使用git的Bash completion中的uu git_ps1)和一个略带颜色的笑脸,以指示最近运行的命令是否成功 笑脸是使用这种技术创建的,我在这里找到了这种技术,所以: SMILEY="${GREEN}:)${COLOR_NONE}" FROWNY="${RED}:(${COLOR_NONE}" STATUS_EMOTICON="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else ech

我正在尝试构建一个Bash提示符,它将包含我的git分支信息(使用git的Bash completion中的uu git_ps1)和一个略带颜色的笑脸,以指示最近运行的命令是否成功

笑脸是使用这种技术创建的,我在这里找到了这种技术,所以:

SMILEY="${GREEN}:)${COLOR_NONE}"
FROWNY="${RED}:(${COLOR_NONE}"
STATUS_EMOTICON="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else echo \"${FROWNY}\"; fi"
下面是我要使用的提示行:

export PS1="[\t]${RED}[\u@$MACHINE:${BOLD_CYAN}\w${GREEN}\$(__git_ps1 ' %s')${RED}]${COLOR_NONE} \`${STATUS_EMOTICON}\`\n$ "
不幸的是,由uu git_ps1运行的程序似乎覆盖了
$?
值,即使在运行
false
之后,我最终发现每个表情符号都是绿色笑脸

正在进行uuu git_ups1呼叫

export PS1="[\t]${RED}[\u@$MACHINE:${BOLD_CYAN}\w${RED}]${COLOR_NONE} \`${STATUS_EMOTICON}\`\n$ "
…使表情符号正确工作

所以我显然需要做的是在运行
\uu git\u ps1
之前评估
${STATUS\u EMOTICON}
,但在
\uu git\u ps1
的输出之后包括评估值。这可能吗?

不要将
$(cmd)
`cmd`
直接放在
PS1
中。相反,使用Bash的
PROMPT\u命令
var。我通常做的是定义一个函数
\u PS1\u cmd
并设置
PROMPT\u命令=\u PS1\u cmd
。然后在
\u PS1\u cmd
中,我设置了希望包含在
PS1
中的其他变量。例如:

THE-OLD-PROMPT#cat PROMPT.rc
函数_PS1_cmd()
{
本地saveExit=$?
#此非零出口不会影响命令行上的$
g_git_ps1=$(回声测试;退出1)
如果((saveExit));则
g_smiley=':('
其他的
g_smiley=':)'
fi
#看起来这不是必须的,至少在Bash4.2.37中是这样
#为了安全起见,一定要归还它。
返回$saveExit
}
提示符命令=\u PS1\u cmd
PS1=“$g_git_PS1$g_smiley”
-OLD-PROMPT#source./PROMPT.rc
测试:)(出口123)
测试:(echo$?
123
测试:)echo$?
0
测试:)

这太棒了!不过我有一个奇怪的问题。由于我的表情符号是彩色编码的,当我的提示被显示时,我看到它周围有大量的转义码。我尝试了很多不同的策略来解决这个问题,但最终我不得不在PS1中使用原始的
\`${STATUS\u EMOTICON}`
片段。不过,我更改了
STATUS\u EMOTICON
以根据从_PS1\u cmd保存的退出代码进行评估,所以现在整个过程按照我的预期进行。