如何获取倒数第二个命令的退出状态?

时间:2017-06-09 16:58:21

标签: bash shell

我想运行2个命令并输出第一个命令的退出状态。而这一切,我想在一个命令行中做到这一点。 像这样的东西

cmd1; cmd2 && echo $?-1

它应该输出cmd1的退出状态。

2 个答案:

答案 0 :(得分:6)

与其状态随时间更新的其他全局变量(即C中的errno)一样,如果要引用旧值,则需要提前存储它。

cmd1; cmd1_retval=$?; cmd2 && echo "$cmd1_retval"

顺便说一下,这是不同的地方:

cmd1 | cmd2 | cmd3
echo "${PIPESTATUS[$(( ${#PIPESTATUS[@]} - 2 ))]}"

那是因为在管道中,所有组件一次运行,默认情况下退出状态是最后一个。但是,在bash中,所有组件的退出状态都存储在PIPESTATUS数组中; ${#PIPESTATUS[@]}获取此数组的长度,并从中减去两个(一个因为基于0和1的索引之间存在差异,一个从最后一个项到第二个到最后一个项)得到前一个管道中倒数第二个项目。

答案 1 :(得分:1)

cmd1; status=$?; cmd2 && echo $status