我尝试在套接字上的读取循环中捕获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
如何立即打破循环并退出应用程序?
答案 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
当然,这只是一个非常粗略的解决方案,不会隐藏由终止子壳等发出的任何错误消息。但它显示了这个想法并解决了你问的问题。为了隐藏预期的错误消息等,您可能想要提出其他问题(或者只是在这里搜索已经给出的答案; - )