【问题标题】:exit status of piped command line in kshksh 中管道命令行的退出状态
【发布时间】:2014-01-08 09:06:03
【问题描述】:

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 中是否有一种更简单的形式来检索管道命令行中的退出状态?以及如何解释上面的行。我对 subshel​​l 和使用 4 作为描述符知之甚少。 重定向部分很难解释

【问题讨论】:

    标签: shell pipe ksh


    【解决方案1】:

    $? 不适合吗?

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

    或者您需要每个管道的特定错误代码

    您也可以尝试使用set 选项

    -e

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

    -o 管道故障

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

    【讨论】:

    • 在上述情况下,$?将打印 0 作为最后执行的命令,即“tee”将成功并且我打算获取 grep 操作的执行状态而不是 tee 操作。您提到的 ksh 中的 pipefail / set -e 如何实现?
    • 我需要在使用管道之前设置选项,这将定义带有管道的 shell 的行为,默认情况下,即使发生中间错误,也会在可能的情况下结束。因此,如果将选项设置为 pipe ,如果您收到 RC 为 0,则所有管道都可以正常工作,如果没有,则需要进行迭代测试以找到失败的管道或标记系统(如每一步 tee_ing)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多