SIGINTと同様のイベントをキャプチャするときに終了コードを維持しますか?

SIGINTと同様のイベントをキャプチャするときに終了コードを維持しますか?

説明されているように使用する場合trap、たとえばhttp://linuxcommand.org/wss0160.php#trap終了する前にctrl-c(または同様)をキャッチして整理し、返された終了コードを変更します。

これは実際の世界に影響を与えない可能性があります(終了コードは移植可能ではなく、それ以上は常に明確ではないためです)。プロセスの終了時にデフォルトの終了コードは何ですか?)しかし、これを防ぎ、スクリプトを中断させる基本的なエラーコードを返す方法が実際にないかどうかはまだ疑問に思います。

はい(bashでは、私の質問はbashに固有のものと見なされるべきではありません):

#!/bin/bash
trap 'echo EXIT;' EXIT
read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _
trap 'echo SIGINT; exit 1;' INT
read -p 'If you ctrl-c me now my return code will be 1. ' _

出力:

$ ./test.sh # doing ctrl-c for 1st read
If you ctrl-c me now my return code will be the default for SIGTERM.
$ echo $?
130
$ ./test.sh # doing ctrl-c for 2nd read
If you ctrl-c me now my return code will be the default for SIGTERM.
If you ctrl-c me now my return code will be 1. SIGINT 
EXIT
$ echo $?
1

(POSIXと互換性があるように削除するように編集されました。)

(bashスクリプトにするために再編集しましたが、私の質問はシェルに限定されません。)

ポータブル「SIGINT」の代わりにトラップにポータブル「INT」を使用するように編集されました。

役に立たない中かっこを削除し、潜在的な解決策を追加するように編集されました。

修正する:

これで、いくつかのエラーコードを終了し、ハードコーディングしてEXITをキャッチして問題を解決しました。エラーコードが異なるか、EXITトラップが不可能なため、一部のシステムでは問題になる可能性がありますが、私の場合はこれで十分でした。

trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM

ベストアンサー1

実際、bashの内部を中断するのは、readbashが実行しているコマンドを中断するのとは少し異なるようです。通常、trapを入力すると、$?この値を保持して同じ値で終了できます。

trap 'rc=$?; echo $rc SIGINT; exit $rc' INT
trap 'rc=$?; echo $rc EXIT; exit $rc' EXIT

sleep などのコマンドまたは組み込みコマンドの実行中にスクリプトが中断されると、次のwaitメッセージが表示されます。

130 SIGINT
130 EXIT

終了コードは130です。しかし、0のようread -pです$?(とにかく私のbashバージョン4.3.42では)。


私のバージョンの変更ファイルによっては、信号処理が進行中である可能性がreadあります...(/usr/share/doc/bash/CHANGES)

この bash-4.3-alpha バージョンと以前のバージョンの bash-4.2-release 間の変更点です。

  1. バッシュの新機能

    Posixモードでは、「読み取り」がキャプチャ信号によって中断される可能性があります。トラップハンドラを実行した後、readは128+signalを返し、部分的に読み取られた入力を削除します。

おすすめ記事