【发布时间】:2020-04-29 05:46:10
【问题描述】:
在我的 .bashrc...
46 function exitstatus()
47 {
48 local a=0
49 local s=$1
50 s=$s+1
51 a=$a+1
52 echo -n ' arg1='$s' a='$a
53 s=$1
54 a=0
55 echo ' arg1='$s' a='$a
56
57 if [[ "$s" = "$a" ]]; then
58 echo "true"
59 else
60 echo "false"
61 fi
62 }
63
64 function myprompt {
65 local ss=\$?
66 unset PS1
67 PS1="exit:\$? var:$ss exitstatus $ss $(exitstatus $ss) \n\t $ "
68 }
69 myprompt
exitstatus 的计算结果始终为 false,即使变量 s 和 a 看起来是相同的字符串:
23:36:55 $ true
exit:0 var:0 exitstatus 0 arg1=0+1 a=0+1 arg1=0 a=0
false
23:36:56 $ false
exit:1 var:1 exitstatus 1 arg1=1+1 a=0+1 arg1=1 a=0
false
第 50 行和第 52 行已向我证明 s 被视为字符串,因此我将其作为第 57 行中的字符串进行比较。如果我将 s 与自身进行比较或将 a 与本身,因为 exitstatus 总是评估为true。出于某种原因,exit status $? 作为 exitstatus 的参数没有按我的预期处理。
我错过了什么?
【问题讨论】:
-
除了你的函数过于复杂(我会把比较写成
if (( s == 0 )); then ...),我无法重现这个问题。当然奇怪的是,您似乎在 .bashrc 中设置了一次PS1并且从未重置它(您何时再次调用myprompt?),但这并不能解释您发布的输出。如果你在命令行s=0; a=0; [[ "$s" = "$a" ]] && echo true上尝试,你会得到什么?而且,我不会将exitstatus与echo语句混在一起,而是通过在set -x下运行它来调试它。 -
exitstatus函数只运行一次,当myprompt运行时(尝试declare -p PS1看看它设置了什么)。要使其在每次显示提示时运行,请使用PS1="... \$(exitstatus $ss) ...而不是PS1="... $(exitstatus $ss) ...。尽管实际上这整件事比它应该的要复杂得多。至少,不要乱用转义的美元符号和ss变量,只需将PS1设置为单引号字符串。 -
我发布了一个答案,解释了为什么你会得到一个静态的
false或静态的true。我也会帮你写一个更好的exitstatus(),但我真的不明白你想用$a和$s做什么。如果您发布最终要求(例如“我的提示应该做......”),我很乐意为您提供帮助。 -
最终,我希望我的提示符显示日期、我的用户名、我正在使用的主机、密码、新行以及绿色或红色文本的时间,具体取决于成功最后一个命令。这些问题让我怀疑单引号没有正确插入颜色转义字符,这就是我改用双引号的原因。
标签: bash prompt ps1 exitstatus