在我的.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的参数,并没有按照我的期望进行处理。
我遗漏了什么?
由于您定义了 PS1="..."
用双引号,子壳 $(exitstatus ...)
只在shell启动时被评估一次。之后,这一次评估的结果是你的提示符的文字部分,不会再改变。
在这个交互式shell会话中,我每秒钟执行一条命令。date +%s
打印当前时间的秒数。我使用 true
作为命令,因为它没有打印任何内容。
$ PS1="$(date +%s) "
23 true
23 true
23 PS1='$(date +%s) '
26 true
27 true
我们可以看到,使用双引号时,子shell只被评估一次,而使用单引号时,子shell在每次打印提示时都会被展开。当然,你也可以写 PS1="\$(date +%s) "
以获得更新提示。