我有一个构建脚本,它执行一个长命令,该命令产生大量输出,如下所示:
./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)。
您可以使用pipefail它由几个炮弹支持,包括选项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]'"
Run Code Online (Sandbox Code Playgroud)
将返回退出状态,./compile除非ts自身失败。
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |