我已经为此苦苦挣扎很长时间了。根据最后一个命令的退出代码,尝试更改颜色作为提示的一部分。
我将提示简化为一个最小的示例:
Red="\[\033[31m\]"
Green="\[\033[32m\]"
Reset="\[\033[0m\]"
statColour(){
if [[ "$1" == "0" ]]; then
echo -e "${Green} $1 "
else
echo -e "${Red} $1 "
fi
}
export PS1="$(statColour \$?)What Colour? $Reset"
尽管结果一开始数字显然为0,但仍始终使用红色。
我尝试了[
和$1 -eq 0
,但没有成功。为什么这不起作用?
尝试一下:
Red="\033[35m"
Green="\033[32m"
Reset="\033[0m"
statColour(){
if [[ $1 = 0 ]]; then
echo -e "${Green} $1 "
else
echo -e "${Red} $1 "
fi
}
export PS1="\$(statColour \$?)What Colour? $Reset"
# ^
statColour
的调用现在每次都完成,而不仅仅是一次。if [[ ]]
优化有关为什么总是选择false分支的说明:
您正在以statColour
作为参数调用\$?
。反斜杠确保$
是按字面值(而不是作为参数扩展的开始),因此实际上是字面字符串$?
。由于?
是通配符,因此正在生成文件名,即,该参数将被名称为$
的所有文件替换,后跟单个字符。如果目录中没有此类文件(可能是这种情况),则将字符串$?
从字面上传递给statColour。
在statColour
内部,您写道
[[ "$1" == "0" ]]
这意味着您要询问字符串$?
是否等于字符串0
。从来没有,因此比较总是错误的。
对于您的问题,您可以尝试这种方法(未经测试,因此您可能需要对其进行一些调试):
statColour() {
# Fetch the exit code of the last program
local last_exit_code=$?
if ((last_exit_code == 0)) # Numeric comparision
then
.....
else
...
fi
# Preserve the exit code
return $last_exit_code
}
并将提示设置为
PS1='$(statColour) '"$Reset"
单引号确保statColour
是动态评估的,而$Reset
是双引号,因为可以静态评估它。