【发布时间】:2021-08-14 06:47:41
【问题描述】:
我编写了一个管道命令并尝试在timeout 下运行它。如果最后一个管道命令成功但第一个不成功,则状态为 0(因为最后一个命令成功)。
我读了这篇关于使用PIPESTATUS 获取状态的帖子:Pipe output and capture exit status in Bash(它还建议使用set -o pipefail,但它也不起作用)。但是,当我尝试在超时下运行它时,PIPESTATUS[0] 不正确,这可能是因为在timeout 下运行它时我需要使用bash -c 运行管道命令(下一篇文章解释了为什么@987654329 @语法应该使用Why does `timeout` not work with pipes?)
代码示例:
function func {
HELLO="hello"
DOES_NOT_EXIST="does_not_exist.txt"
CMD="ls $DOES_NOT_EXIST | echo $HELLO"
echo $CMD
timeout 5 bash -c "$CMD"
echo ${PIPESTATUS[0]}
}
#main
func
输出:
ls does_not_exist.txt | echo hello
hello
ls: cannot access does_not_exist.txt: No such file or directory
0
最后一行是echo hello的状态,而不是ls的失败状态(我没记错的话应该是2)。有没有办法获取管道中第一个命令的状态? (我的实际需要是获取第一个管道命令的状态,无论它是否失败)
【问题讨论】:
-
$PIPESTATUS仅获取当前 shell 运行的命令的状态。您正在使用bash -c的不同bash进程中运行命令
标签: bash