Bash中的管道输出和捕获退出状态

我想执行Bash中长时间运行的命令,都捕获它的退出状态,并且发球它的输出。

所以我这样做:

command | tee out.txt
ST=$?

问题在于变量ST捕获了tee而不是命令的退出状态。 我该如何解决?

请注意,命令运行时间长,将输出重定向到文件以供以后查看对于我来说不是一个好的解决方案。


#1楼

哑巴解决方案:通过命名管道(mkfifo)连接它们。 然后可以第二次运行该命令。

 mkfifo pipe
 tee out.txt < pipe &
 command > pipe
 echo $?

#2楼

有一个数组可以为您提供管道中每个命令的退出状态。

$ cat x| sed 's///'
cat: x: No such file or directory
$ echo $?
0
$ cat x| sed 's///'
cat: x: No such file or directory
$ echo ${PIPESTATUS[*]}
1 0
$ touch x
$ cat x| sed 's'
sed: 1: "s": substitute pattern can not be delimited by newline or backslash
$ echo ${PIPESTATUS[*]}
0 1

#3楼

有一个内部Bash变量$PIPESTATUS ; 它是一个数组,用于保存最后一个命令前台管道中每个命令的退出状态。

<command> | tee out.txt ; test ${PIPESTATUS[0]} -eq 0

或者也可以与其他shell(例如zsh)一起使用的另一种替代方法是启用pipefail:

set -o pipefail
...

第一个选项工作zsh由于一点点不同的语法。


#4楼

此解决方案无需使用bash特定功能或临时文件即可工作。 奖励:最后,退出状态实际上是退出状态,而不是文件中的某些字符串。

情况:

someprog | filter

要从退出状态someprog和输出filter

这是我的解决方案:

((((someprog; echo $? >&3) | filter >&4) 3>&1) | (read xs; exit $xs)) 4>&1

echo $?

在unix.stackexchange.com上,对于

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值