
私はこの予期しない行動を偶然発見し、よりよく知っている人がそれを説明できることを願っています!
スクリプトによって呼び出され、バックグラウンドプロセスとして実行される関数があります。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を受け取ります。