SIGINTでのBash Break ReadLine
質問
私はソケット上の読み取りループ内で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
.
もちろん、これは非常に粗い解決策で、終端サブシェルなどによって発行されたエラーメッセージを隠していませんが、アイデアを表示し、あなたが尋ねた問題を解決します。期待されるエラーメッセージなどを隠すために、他の質問をしたい場合(またはすでにここですでに与えられた答えを検索することができます。 - )
所属していません StackOverflow