4

我尝试在套接字上的读取循环中捕获 SIGINT ctrl+c,但我要求的中断仅在换行后得到处理。因此,当我 ctrl+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

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

4

1 回答 1

3

Abreak不是您可以在任何地方执行的真正命令;它只是一个句法结构,用于标记离开周围循环的点。您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

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

于 2014-07-30T09:17:49.260 回答