测试退出状态的等价性

测试退出状态的等价性

以下两个命令列表可移植等效吗?

$foo; echo $? #(1)

$foo && echo 0 || echo $? #(2)

后记

考虑这样定义的命令exit-status

#!/bin/sh
exit "$1"

POSIX 标准是否禁止以下行为?

> exit-status 2 && echo "impossible branch"; echo $?
1

如果不是,那么符合 POSIX 的 shell 可能无法将两个最上面的命令列表等同起来。这和不便携不太一样……

答案1

两个命令行都是可移植的。而且两者的效果是一样的。

关于第二个:如果$foo失败,echo 0则不进行评估,从而echo $?打印最后一个命令的退出状态 - 即$foo

逻辑运算符是左关联的,即第二个命令行相当于:

$ { $foo && echo 0 } || echo $? 

(其中第一个$表示 shell 提示符)

外壳命令语言标准化命令列表、运算符关联性等。

第 2.9.3 节外壳命令语言还指定 && 运算符的退出状态语义:

退出状态

AND 列表的退出状态应为列表中执行的最后一个命令的退出状态。

关于你的后记:是的,POSIX 不允许。

相关内容