使用 ts 而不丢失退出值

使用 ts 而不丢失退出值

我有一个构建脚本,它执行一个长命令,产生大量输出,如下所示:

./compile

为了解决编译性能问题,我想使用ts(来自更多实用程序) 为每个输出行添加时间戳作为前缀。所以我像这样更新了我的脚本:

bash -c "./compile | ts '[%Y-%m-%d %H:%M:%S]'"

这是可行的,但现在退出值始终是0, event when compilefailed (我认为,因为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 支持的选项,包括bashksh93zshmkshyashbusybox ash(以及sh将被添加到POSIX 的下一个主要版本的规范中)并导致管道的退出状态为最右侧失败命令的退出状态。

例如, 的退出状态(exit 3) | (exit 4) | (exit 0)将为4

bash -o pipefail -c "./compile | ts '[%Y-%m-%d %H:%M:%S]'"

./compile除非ts自身失败,否则将以退出状态返回。

相关内容