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