Bash 使用Ubuntu`timeout捕获超时命令的输出`

Bash 使用Ubuntu`timeout捕获超时命令的输出`,bash,timeout,sh,Bash,Timeout,Sh,相关问题: 这最终不需要解决 这一解决方案不涉及超时,但建议超时在可用时可用于此目的 我的问题: 此命令不产生输出到foo.txt: $ cat foo.sh #!/bin/sh sh -c "echo foo; sleep 5; echo bar" | awk '/foo/ {print $1}' $ timeout 2 ./foo.sh > foo.txt 如果我没有重定向到foo.txt,我会看到foo按预期立即打印出来 另一方面,以下命令按预期在文件foo.txt中生成“foo

相关问题:

这最终不需要解决

这一解决方案不涉及
超时
,但建议
超时
在可用时可用于此目的

我的问题:

此命令不产生输出到
foo.txt

$ cat foo.sh 
#!/bin/sh
sh -c "echo foo; sleep 5; echo bar" | awk '/foo/ {print $1}'
$ timeout 2 ./foo.sh > foo.txt
如果我没有重定向到
foo.txt
,我会看到
foo
按预期立即打印出来

另一方面,以下命令按预期在文件
foo.txt
中生成“foo”:

$ timeout 2 sh -c "echo foo; sleep 5; echo bar" > foo.txt
$ cat foo.txt
foo

有人知道为什么会发生这种情况,以及如何最好地解决它吗?这是一个很有趣的例子,但我正在运行的导致此问题的实际脚本在命令行上生成了大约100行输出,但如果在终止之前超时,
foo.txt也会保留为空。

根据我的经验,这是因为管道“|”wait“echo foo;sleep 5;echo bar”运行完成。因此,在5s之后,awk可以获得输出,但超时会在2s内终止命令,使其无法获得文本

编辑:

也许这会有所帮助,您可以将char(“)移动到末尾,如下所示:

$ cat foo.sh 
#!/bin/sh
sh -c "echo foo; sleep 5; echo bar | awk '/foo/ {print $1;}'"
$ timeout 2 ./foo.sh > foo.txt
$ cat foo.txt 
foo

我找到了一个解决方案。关键是在awk脚本中添加
fflush()
,它似乎在缓冲输出:

#!/bin/sh
sh -c "echo foo; sleep 5; echo bar" | awk '/foo/ {print $1; fflush()}'
$ timeout 2 ./foo.sh > foo.txt