在bash
中,从环境变量$PIPESTATUS
我们可以检索管道命令行的退出状态,如下所示。
$ echo "some string" | grep x | tee some.tmp ; echo ${PIPESTATUS[1]}
1
但是如果我在ksh
,我需要像下面这样才能获得退出状态。我搜索它得到类似下面的东西。
$ getme=`((echo "some string" | grep x 3>&- 4>&- ; echo $? >&4) | tee some.tmp 1>&3 3>&- 4>&- ) 4>&1` ; echo $getme
1
$ getme=`((echo "some string " | grep me 3>&- 4>&- ; echo $? >&4) | tee some.tmp 1>&3 3>&- 4>&- ) 4>&1` ; echo $getme
0
在ksh
中有一个更简单的表单来检索管道命令行中的退出状态吗?以及如何跨越上线。对于子壳和放大器我知之甚少。使用4作为描述符。
重定向部分对于interprit来说有点害怕
答案 0 :(得分:2)
$?
不适应?
echo "some string" | grep x | tee some.tmp ; echo "Returncode: $?"
或者您需要为每个管道
指定特定的错误代码您也可以尝试使用set
选项
-e
除非包含在||中或者&&命令,或命令后面的if while或until命令或管道跟随!,如果命令具有非零退出状态,则执行ERR陷阱(如果已设置),然后退出。读取配置文件时禁用此模式。
-o pipefail
直到管道的所有组件都已完成,管道才会完成,返回值将是最后一个非零命令失败的值,如果没有命令失败则返回零。