我正在运行这样的模拟
./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。