首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bash退出状态始终失败比较

Bash退出状态始终失败比较
EN

Stack Overflow用户
提问于 2020-04-29 13:46:11
回答 2查看 47关注 0票数 0

在我的.bashrc..。

代码语言:javascript
运行
复制
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看起来是同一个字符串:

代码语言:javascript
运行
复制
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的参数并没有像我预期的那样被处理。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2020-04-29 16:10:54

由于您使用双引号定义了PS1="...",因此当shell启动时,子shell $(exitstatus ...)只会被计算一次。在此之后,一次求值的结果将是提示符的文字部分,并且不会再更改。

最小示例

在这个交互式shell会话中,我每秒执行一个命令。date +%s打印当前时间的秒数。我使用true作为命令,因为它不打印任何内容。

代码语言:javascript
运行
复制
$ PS1="$(date +%s) "
23 true
23 true
23 PS1='$(date +%s) '
26 true
27 true

正如我们所看到的,使用双引号时,子see只计算一次,而使用单引号时,每次打印提示符时都会展开该子see。当然,您也可以编写PS1="\$(date +%s) "来获取更新提示符。

票数 0
EN

Stack Overflow用户

发布于 2021-07-15 03:52:08

这就是最终奏效的方法。我去掉了提示符,使用exitstatus更改了提示符的颜色:

代码语言:javascript
运行
复制
function exitstatus { if [[ $? != 0 ]]; then echo -e "\e[48;5;52m"; fi; }
unset PS1 PS2 PS4
PS1='$(exitstatus) $'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61495060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档