GNU/Linux >> Linux の 問題 >  >> Linux

シェルスクリプトで、閉じたファイル記述子の使用によって引き起こされるSigpipeを回避するにはどうすればよいですか?

シェルスクリプトは、もう一方の端がなくなると、標準およびその他のファイル記述子を失う可能性があります。これが発生する可能性のある1つの方法は、sshを終了することです。 スクリプトの起動に使用されたクライアント:

$ ssh localhost test
^C

これにより、bashが起動します testというスクリプト SSHおよびCtrl経由 C sshを終了するために使用されます 指図。これはtestを終了しません これは実行を継続しますが、添付されたファイル記述子(標準の入力/出力/エラーなど)を閉じます。

testの場合 これらの閉じたファイル記述子を使用しようとすると、SIGPIPEで終了します。 。シンプルなecho 十分です。

testの1つ logがあるかもしれません echoを使用する関数 systemdジャーナルと標準エラーにメッセージを書き込みます。このようなもの:

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

2番目のecho SIGPIPEを発生させます sshの後 セッションが強制終了されます( Ctrl C )。これを防ぐことができるため、問題のあるechoなしで実行を続行できます。 、echoを配置する サブシェル内:

( echo >&2 "$*" )

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

承認された回答:

スクリプトでSIGPIPEを無視したい場合は、次のようにできます。

trap "" PIPE

Linux
  1. ファイルの行をコマンドの引数として使用するにはどうすればよいですか?

  2. ファイルを bash シェル スクリプトに含める方法

  3. 起動時にシェルスクリプトを実行する方法

  1. LinuxでTarコマンドを使用する方法

  2. シェルスクリプトで一時ファイルを作成するにはどうすればよいですか?

  3. シェルで .sh 拡張子のないファイルを実行する方法

  1. Echo To File Descriptorはファイルを上書きしますか?

  2. シェルスクリプトでバッファにデータを追加する方法は?

  3. 現在のgitブランチの名前をシェルスクリプトの変数に取得する方法は?