- ベストアンサー
シェルスクリプトのtrap処理について
- シェルスクリプトのtrap処理について質問があります。
- スクリプト中断時にも処理が実行され、不要な書き込みが行われる場合があります。
- どのような流れでtrap処理が動作し、途中で処理を中断させる方法について教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
このあたり、ジョブ制御(バックグラウンドジョブとか)まで含めてきちんと説明するのは実は大変です。 基本的な流れは、man bashに書いてあるのですが、読み取るのが難しいかもしれません。 Ctrl-C の SIGINT(kill -2)は、スクリプトの/bin/shと、稼働中のコマンドこの場合はsleepの両方に伝わります。sleep はSIGINTで終了し、終了コードは130(=128+2)になります。その後、trapが実行され、echo stoppedしますが、/bin/sh自体は終了しないので、続きのコマンドであるecho end >test1.txt を実行します。 処理の中断をするには2通りあって、 案1) trap "echo 'stopped';exit" 1 2 3 15 # trapの中で/bin/shを終了 echo start > test1.txt sleep 100 echo end > test1.txt 案2) trap "echo 'stopped'" 1 2 3 15 echo start > test1.txt sleep 100 || exit # 終了コードが非ゼロなら/bin/shを終了 echo end > test1.txt 案2の変形) trap "echo 'stopped'" 1 2 3 15 echo start > test1.txt sleep 100 if [ $? -ne 0 ] then exit fi echo end > test1.txt ただし、案2の場合は、時間のかかる処理が複数あれば、その処理毎に終了コードの判断が必要ですね。 また、上記例では、exit とだけ書きましたが、実際は、exit 1 などとゼロ以外の終了コードで終わらせた方が良いでしょうね。
お礼
trap処理について何度も回答いただきましてありがとうございます>< 作成したいと思っているスクリプトは複数処理がありますので、案2ではなく、案1でやりたいと思います。 trapを調べていて、いろいろなサイトでexitを書いていたりなかったりで、あまり深く考えておりませんでしたが、途中で終了させることができるのですね! 大変勉強になりました! ありがとうございます!!