シェルスクリプトは、閉じたファイル記述子を使用して発生するSIGPIPEをどのように防止しますか?

シェルスクリプトは、閉じたファイル記述子を使用して発生するSIGPIPEをどのように防止しますか?

反対側の端が消えると、シェルスクリプトは標準やその他のファイル記述子を失う可能性があります。これが発生する1つの方法は、sshスクリプトを起動するために使用されたクライアントをシャットダウンすることです。

$ ssh localhost test
^C

これにより、bashSSH で呼び出されるスクリプトが開始され、a を使用してコマンドが終了します。これは連続を終了しませんが、添付ファイル記述子(標準入力/出力/エラーなど)を閉じます。testCtrlCsshtest

閉じたファイル記述子を使用testしようとするとSIGPIPEecho

標準エラーだけでなく、systemdログにもメッセージを記録する機能がある可能性がありtestます。このような:logecho

log() {
 echo "$*" | systemd-cat -t test
 echo >&2 "$*"
}

2番目はセッションが終了した後にechoa()を発生させます。問題なく実行が続くようにサブシェルに入れることで、このようなことが発生するのを防ぐことができます。SIGPIPEsshCtrlCechoecho

( echo >&2 "$*" )

しかし、もっと良い方法がありますか?

ベストアンサー1

スクリプトでSIGPIPEを無視するには、次のようにします。

trap "" PIPE

おすすめ記事