【发布时间】:2021-07-02 09:34:37
【问题描述】:
我真正想做的事
保存命令的输出并检查其返回状态。
解决办法?
经过一番谷歌搜索后,我在StackOverflow 以及AskUbuntu 和Unix/Linux StackExchange 上找到了基本相同的答案:
if output=$(command); then
echo "success: $output"
fi
问题
使用command info put 尝试此解决方案时,即使实际命令失败,也会执行 if 子句,但我无法解释为什么?
我尝试手动检查返回值$?,似乎var= 更改了返回值:
$ info put
info: No menu item 'put' in node '(dir)Top'
$ echo $?
1
$ command info put
info: No menu item 'put' in node '(dir)Top'
$ echo $?
1
$ var=$(command info put)
info: No menu item 'put' in node '(dir)Top'
$ echo $?
0
$ var=$(command info put); echo $?
info: No menu item 'put' in node '(dir)Top'
0
`
那么为什么这种通用解决方案在这种情况下不起作用? 以及如何更改/调整解决方案以使其正常工作?
我的环境/系统
我正在使用 WSL2 Ubuntu 20.04.2 LTS 在 Windows 10 上工作:
$ tmux -V
tmux 3.0a
$ echo $SHELL
/bin/bash
$ /bin/bash --version
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
$ info --version
info (GNU texinfo) 6.7
【问题讨论】:
-
您确定您使用的是 bash 吗?我无法重现。
-
POSIX 要求您的预期行为,因此它应该可以在任何兼容的 shell 中工作。
-
如果你使用
var=$(false); echo $?,你会看到什么? -
这似乎是特定于
info命令的(也许只是它的某些版本?)。在我的快速测试中,如果它的标准输出不是 tty,它会以成功状态退出(尽管实际上失败了)。