相关问题:
此question最终不需要解决。
此question的解决方案不涉及timeout
,但建议timeout
可用于此目的。
我的问题:
此命令不会向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"按预期在文件foo.txt
中输入:
$ timeout 2 sh -c "echo foo; sleep 5; echo bar" > foo.txt
$ cat foo.txt
foo
有谁知道为什么会发生这种情况以及如何最好地解决这个问题?这是一个玩具示例,但我运行的导致此问题的实际脚本在命令行上产生大约100行输出,但如果在终止之前超时则会使foo.txt
为空。
答案 0 :(得分:0)
根据我的经验,这是因为管道" |"等待" echo foo;睡5;回音栏"运行完成。因此,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
答案 1 :(得分:0)
我找到了解决方法。关键是在awk脚本中添加fflush()
,这似乎是在缓冲输出:
#!/bin/sh
sh -c "echo foo; sleep 5; echo bar" | awk '/foo/ {print $1; fflush()}'
$ timeout 2 ./foo.sh > foo.txt