このbashの動作を理解するのに役立ちますか?バックグラウンドプロセスと現在のプロセスへの添付

このbashの動作を理解するのに役立ちますか?バックグラウンドプロセスと現在のプロセスへの添付

私はこの予期しない行動を偶然発見し、よりよく知っている人がそれを説明できることを願っています!

スクリプトによって呼び出され、バックグラウンドプロセスとして実行される関数があります。some_function &これを変数に割り当てたときにxxx=$(some function &)スクリプトを殺すと、プロセスも死ぬことがわかりました。しかし、スクリプトを終了すると、変数に割り当てられていないプロセスは引き続き実行されます。

なぜこれですか?変数にコマンドを割り当てればスクリプトに接続できると思いましたが、スクリプトを殺すとそれも死にますか?それは私にとって良いことです。私はそれを理解したいと思います。関数自体は何も返しません。

コードは次のとおりです。

screen_saver_function () { while true; do echo "some phrase"; done }
yyy=$(cat /dev/$tty > /tmp/tty &)
xxx=$(screen_saver_function > /dev/$tty &)
while true; do [[ ! -z $(cat /dev/$tty) ]] && break; done

アイデアは、screen_saver_functionの出力を端末(最初の行)にパイプしてから、キーを押すと終了することです。端末のテキストをファイルに書き込み、そのテキストがファイルに表示されたらスクリプトを終了します。私はそれが不都合ではないことを知っていますが、動作します。私は$をキャッチ!説明された奇妙な動作が発生した場合は、その動作を終了してバックグラウンドプロセスを終了します。

ベストアンサー1

ではxxx=$(some function &)そうです。そのサブシェルで非同期的に実行されていますが、some function標準出力は依然としてコマンド置換によって生成されたパイプの書き込み端に接続されています。

したがって、サブシェルは非同期で開始された直後に終了しますが、パイプのsome function読み取りの終わりからコマンド置換の出力を読み取り、変数を埋める親シェルはまだパイプ$xxxのファイルの終わりを待ちます。some function完了する前に発生します。

親シェルが終了すると、パイプの読み取り終了が閉じられ、some function次回stdout(パイプに)に書き込もうとするとSIGPIPEを受け取ります。

おすすめ記事