ksh中管道命令行的退出状态

时间:2014-01-08 09:06:03

标签: shell pipe ksh

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来说有点害怕

1 个答案:

答案 0 :(得分:2)

$?不适应?

echo "some string" | grep x | tee some.tmp ; echo "Returncode: $?"

或者您需要为每个管道

指定特定的错误代码

您也可以尝试使用set选项

  

-e

     

除非包含在||中或者&&命令,或命令后面的if while或until命令或管道跟随!,如果命令具有非零退出状态,则执行ERR陷阱(如果已设置),然后退出。读取配置文件时禁用此模式。

     

-o pipefail

     

直到管道的所有组件都已完成,管道才会完成,返回值将是最后一个非零命令失败的值,如果没有命令失败则返回零。