有时候我们使用管道的时候还需要获取管道前的命令执行状态,默认使用 $? 只能取到最后一个命令的退出状态。

如果使用管道以后就不行了。

cmd1 | cmd2 | cmd3

PIPESTATUS 特殊数组中提供了退出代码。 cmd1 退出代码在 ${PIPESTATUS[0]} 中,cmd3 退出代码在 ${PIPESTATUS[2]} 中,因此 $? 总是与 ${PIPESTATUS: -1} 相同。

通过上述方法可以获取 cmd1 的状态了。

举例:

fff | wc -l
echo "fff 执行结束,退出状态为 ${PIPESTATUS[0]}"