我有一个构建脚本,它执行一个长命令,该命令产生大量输出,如下所示:
./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 次 |
最近记录: |