質問

私はソケット上の読み取りループ内でSigint 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
.

すぐにループを壊してアプリを終了する方法は?

役に立ちましたか?

解決

breakが実際のコマンドではありません。周囲のループを残すためのポイントをマークするための単なる構文構成です。breakには周囲のループがありませんので、意味がありません(そしてエラーです:bash: break: only meaningful in a `for', `while', or `until' loop)。

代わりにreadコマンドをkill kill:

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
.

もちろん、これは非常に粗い解決策で、終端サブシェルなどによって発行されたエラーメッセージを隠していませんが、アイデアを表示し、あなたが尋ねた問題を解決します。期待されるエラーメッセージなどを隠すために、他の質問をしたい場合(またはすでにここですでに与えられた答えを検索することができます。 - )

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top