有人能告诉我为什么bash
不能Ctrl+c正确终止以下语句吗?
$( { ( tail -fn0 /tmp/a.txt & )| while read line; do echo $line; done } 3>&1 )
我运行这条语句,然后启动两个bash
进程和一个tail
进程(从 获取ps auxf
),然后输入Ctrl+c,它不会退出到bash
提示符,此时我看到两个bash
进程停止了,而tail
仍在运行,那么我输入一些东西/tmp/a.txt
,然后我们可以进入 bash 提示符。
我想要的是,输入Ctrl+c,然后退出bash
提示,没有任何相关过程。
有人解释这个语句的确切过程会更加感激,比如管道导致 bash 分叉,某些东西重定向到某个地方等等。
2014 年 10 月 9 日更新:
这里提供一些更新,以防它对您有用。我采用的解决方案与两个因素相似:
使用 tmp pid 文件
( tail -Fn0 ${monitor_file} & echo "$!" >${tail_pid} ) | \ while IFS= read -r line; do xxxx done
使用陷阱如:
trap "rm ${tail_pid} 2>/dev/null; kill 0 2>/dev/null; exit;" INT TERM
杀死相关进程并删除剩余文件。
请注意,这kill 0 2
是特定于 bash 的,0 表示当前进程组中的所有进程。该解决方案使用了 tmp pid 文件,而我仍然期望其他没有 tmp pid 文件的解决方案。