web-dev-qa-db-ja.com

コマンドラインで信号をキャッチする方法は?

私はこれを尋ねました 質問SIGPIPEシグナルは、回答に示されているようにコマンドの実行を停止するために生成されます。

しかし、この信号をキャプチャしてコマンドを正常に終了するにはどうすればよいですか?コマンドは、パイプが壊れているというエラーで終了します。

[エラー] [エルノ32]パイプの破損

表示されるエラーメッセージです

6
user2555595

AFAIK、このような信号を「キャッチ」する唯一の方法は、trapコマンドを使用することです。特定の信号を受信したときに実行するアクション(関数またはコマンド)を具体的に設定します。

#!/bin/bash


cleanup () {
    ...do cleanup tasks & exit...
}

trap "cleanup" SIGPIPE

### MAIN part of script

このアプローチは、単一のワンライナーとスクリプトで同じように簡単に行うことができます。 cleanupが表示されたときにSIGPIPEと呼ばれる「関数」も、同じように簡単に手の込んだワンライナーになる可能性があります。

$ trap "cmd1; cmd2; cmd3;" SIGPIPE

リンクした元の質問を振り返ると: 無限ループの終了 、このアプローチもそこに表されていることに気付くでしょう。

6
slm