我想修改我的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的手册页中说
Bash允许通过插入许多反斜杠转义的特殊字符来自定义这些提示字符串,这些特殊字符的解码方式如下:
(列表中包含
\e
,\[
,\]
等)后的字符串被解码,则通过参数扩展,命令替换扩大,...
这意味着\[..\]
不能来自命令替换,而必须在命令替换之前存在。
(这也意味着您可以使用\u
或\w
作为命令替换的参数,并且它们将在命令运行之前被替换。而且我不知道将\[..\]
命令替换放入其中会做什么...换种说法更有意义大约。)
因此,我们必须将颜色代码放在单独的扩展中,并\[..\]
用手保护它们。我将使用变量代替命令替换,并使用$'...'
扩展来获得ESC字符:
prompt_smile() {
if [ "$?" = 0 ] ; then
smile=' :) '
smilecolor=$'\e[1;32m'
else
smile=' :( '
smilecolor=$'\e[1;31m'
fi
normalcolor=$'\e[0m'
}
PROMPT_COMMAND=prompt_smile
PS1='\u@\h \W \$ \[$smilecolor\]$smile\[$normalcolor\]\n'
(*我想知道的原因是,对较旧且相似但又没有那么重复的问题的答案似乎是\[..\]
从扩展中输出的)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句