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
read -p
、現在のコプロセスから入力を読み取ると書かれています。
read
現在のコプロセスから読み取るように指示するtrap cmd SIGINT
と、標準を使用する必要があると動作しないためtrap cmd INT
です。