我正在运行这样的模拟
./waf --run scratch/myfile | awk -f filter.awk
waf一旦filter.awk检测到发生了某些事情(例如在读取特定行之后),我如何才能终止命令?
我不能改变waf或myfile。我只能更改filter.awk, 和上面的命令(显然)。
评论后更新:
waf收到后不会终止SIGPIPE(应该吗?)- 它产生需要清理的子进程。
这是我自己的答案 (和挑战)。
在处理了@thatotherguy 和@Chris 的答案之后,我简化了一点,得到了这个:
tmp=$(mktemp)
{ ./waf --run scratch/myfile & echo $! > "$tmp"; } | { awk -f filter.awk; pkill -P $(<$tmp); kill $(<$tmp); }
不幸的是,我无法摆脱该tmp文件,每次尝试将其PID作为变量传递都失败了。
我不会更改已接受的答案(因为它是在真正需要时才起作用的答案),但对于任何可以简化更多的人来说都是 +1。