我有一个构建脚本,它执行一个长命令,产生大量输出,如下所示:
./compile
为了解决编译性能问题,我想使用ts
(来自更多实用程序) 为每个输出行添加时间戳作为前缀。所以我像这样更新了我的脚本:
bash -c "./compile | ts '[%Y-%m-%d %H:%M:%S]'"
这是可行的,但现在退出值始终是0
, event when compile
failed (我认为,因为ts
退出时没有错误)。
如何compile
在使用时更新我的脚本以返回退出代码ts
?
答案1
由于您使用的是 Bash,因此您可以使用它,$PIPESTATUS
它是一个数组,其中包含管道中命令的不同退出代码:
bash -c './compile | ts "[%Y-%m-%d %H:%M:%S]"; exit "${PIPESTATUS[0]}"'
zsh
有类似的功能,但使用$pipestatus
数组代替(还要记住zsh
数组是从 编号1
,而不是0
)。
答案2
您可以使用pipefail
一些 shell 支持的选项,包括bash
、ksh93
、zsh
、mksh
和yash
busybox ash
(以及sh
将被添加到POSIX 的下一个主要版本的规范中)并导致管道的退出状态为最右侧失败命令的退出状态。
例如, 的退出状态(exit 3) | (exit 4) | (exit 0)
将为4
。
bash -o pipefail -c "./compile | ts '[%Y-%m-%d %H:%M:%S]'"
./compile
除非ts
自身失败,否则将以退出状态返回。