在不丢失退出值的情况下使用 ts

BoD*_*BoD 5 shell-script

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

./compile
Run Code Online (Sandbox Code Playgroud)

为了对编译性能进行故障排除,我想使用ts(来自moreutils)它在每个输出行前加上时间戳。所以我像这样更新了我的脚本:

bash -c "./compile | ts '[%Y-%m-%d %H:%M:%S]'"
Run Code Online (Sandbox Code Playgroud)

这有效,但现在退出值总是0,compile失败时事件(我认为,因为ts退出没有错误)。

如何compile在使用时更新我的脚本以返回退出代码ts

Ste*_*itt 10

由于您使用的是 Bash,您可以使用它$PIPESTATUS的数组,其中包含来自管道中命令的不同退出代码:

bash -c './compile | ts "[%Y-%m-%d %H:%M:%S]"; exit "${PIPESTATUS[0]}"'
Run Code Online (Sandbox Code Playgroud)

zsh具有类似的功能,但使用$pipestatus数组代替(还请记住,zsh数组的编号是从1,而不是0)。


Sté*_*las 5

您可以使用pipefail它由几个炮弹支持,包括选项bashksh93zshmkshyash和busybox的ash(和将被添加到的规格sh在POSIX的下一个主要版本),使管道的退出状态是权-最失败的命令。

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

bash -o pipefail -c "./compile | ts '[%Y-%m-%d %H:%M:%S]'"
Run Code Online (Sandbox Code Playgroud)

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