0

在我的 .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 的参数没有按我的预期处理。

我错过了什么?

4

2 回答 2

0

这就是最终奏效的方法。我摆脱了 myprompt 并习惯于exitstatus更改提示的颜色:

function exitstatus { if [[ $? != 0 ]]; then echo -e "\e[48;5;52m"; fi; }
unset PS1 PS2 PS4
PS1='$(exitstatus) $'
于 2021-07-14T19:52:07.777 回答
0

由于您PS1="..."使用双引号定义,因此$(exitstatus ...)仅在 shell 启动时评估子 shell 一次。在那之后,该评估的结果是您提示的文字部分,不会再改变。

最小的例子

在这个交互式 shell 会话中,我每秒执行一个命令。date +%s打印当前时间的秒数。我使用trueas 命令,因为它什么也不打印。

$ PS1="$(date +%s) "
23 true
23 true
23 PS1='$(date +%s) '
26 true
27 true

正如我们所看到的,使用双引号,子shell 只评估一次,而使用单引号,每次打印提示时都会扩展子shell。当然,您也可以写信PS1="\$(date +%s) "给获取更新提示。

于 2020-04-29T08:10:54.440 回答