我想修改我的 PS1 以每次运行一些命令。假设我想要它,如果最后执行的命令成功,它会在 PS1 的末尾添加一个绿色的微笑,否则微笑应该是红色的。
我将它提取到一个函数中:
function exit_smile {
EXITSTATUS="$?"
RED="\[\e[1;31m\]"
GREEN="\[\e[32;1m\]"
if [ "${EXITSTATUS}" -eq 0 ]
then
SMILE="${GREEN}:)"
else
SMILE="${RED}:("
fi
echo -n "$SMILE"
}
然后尝试使用`exit_smile`
和\$(exit_smile)
修改 PS1 变量,但它在修改 PS1 或打印文字\[\e...\]
而不是颜色时执行一次。
例如
PROMPT="\u@\h \W"
PS1="${PROMPT} \$ \$(exit_smile) ${OFF}\n"
给出username@hostname ~ $ \[\e[32;1m\]:)
我错过了什么?
我不确定这是否在版本(*)之间发生了变化,但是我的 Bash 手册页说
这意味着
\[..\]
不能来自命令替换,但必须在此之前存在。(这也意味着您可以使用
\u
or\w
作为命令替换的参数,并且它们会在命令运行之前被替换。而且我不知道放入\[..\]
命令替换会做什么......这会更有意义大约。)因此,我们必须将颜色代码放在单独的扩展中并
\[..\]
用手保护它们。我将使用变量而不是命令替换,以及$'...'
获取 ESC 字符的扩展:(*我对此感到疑惑的原因是,对于较旧且类似但没有如此重复的问题的答案似乎
\[..\]
从扩展中输出)