Bash退出状态总是失败比较

问题描述 投票:0回答:1

在我的.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,即使在变量 sa 似乎是同一个字符串。

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的参数,并没有按照我的期望进行处理。

我遗漏了什么?

bash prompt ps1 exitstatus
1个回答
0
投票

由于您定义了 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) " 以获得更新提示。

© www.soinside.com 2019 - 2024. All rights reserved.