Bash管道命令及其返回

时间:2015-04-24 15:21:37

标签: bash shell

是否有任何方法可以通过管道命令复制其先前的命令退出状态?

例如:

#/bin/bash
(...)
function customizedLog() {
   # do something with the piped command output
   exit <returned value from the last piped comand/script (script.sh)>
}

script.sh | customizedLog
echo ${?} # here I wanna show the script exit value
(...)

我知道我可以使用$ {PIPESTATUS [0]}来检查返回,但我真的想这样做,就像customLog函数不存在一样。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

在bash中:

set -o pipefail

这将返回管道中的最后一个非零退出状态,如果管道中的所有命令都成功,则返回零。

set -o pipefail
script.sh | customizedLog
echo ${?}

确保customizedLog成功(return 0),然后您应该选择退出状态script.sh。使用false | customizedLogtrue | customizedLog进行测试。

答案 1 :(得分:2)

script.sh | customizedLog

以上将在两个单独的进程中运行(或者实际上是3个 - customizedLog将在bash fork中运行,因为您可以使用类似ps -T --forest的内容进行验证。据我所知,使用UNIX进程模型,唯一可以访问进程返回信息的进程是其父进程,因此自定义日志无法检索它。

所以不,除非前一个命令是从一个通过管道传递退出状态的包装器命令运行的(例如,作为最后一行):

( command ; echo $? ) | piped_command_that_is_aware_of_such_an_arrangement