我想运行2个命令并输出第一个命令的退出状态。而这一切,我想在一个命令行中做到这一点。 像这样的东西
cmd1; cmd2 && echo $?-1
它应该输出cmd1的退出状态。
答案 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