BASH打破了SIGINT的读取线

时间:2014-07-30 08:50:41

标签: bash signals bash-trap

我尝试在套接字上的读取循环中捕获SIGINT ctrl + c,但我要求的中断仅在新行之后得到处理。因此,当我按下c + + c我正在运行的应用程序时,我必须在循环中断/应用程序退出之前等待新行到达套接字

这是最小版本:

trap "break" SIGINT SIGHUP SIGTERM
exec 3<>/dev/tcp/192.168.1.84/50885

while read line  
do   
   echo -e "$line\n" 
done <&3

如何立即打破循环并退出应用程序?

1 个答案:

答案 0 :(得分:3)

break不是一个真正的命令,你可以在任何你想要的地方执行;它只是一个语法结构来标记一个离开周围循环的点。您的break没有周围的循环,因此没有意义(并且是错误:bash: break: only meaningful in a `for', `while', or `until' loop)。

您需要取消read命令:

trap "killRead" SIGINT SIGHUP SIGTERM

killRead() {
  kill $(cat /tmp/read.pid)
}

exec 3<>/dev/tcp/192.168.1.84/50885

while read line  
do   
   echo -e "$line\n" 
done <&3 & pid=$!

echo $pid > /tmp/read.pid

wait $pid

当然,这只是一个非常粗略的解决方案,不会隐藏由终止子壳等发出的任何错误消息。但它显示了这个想法并解决了你问的问题。为了隐藏预期的错误消息等,您可能想要提出其他问题(或者只是在这里搜索已经给出的答案; - )