bashスクリプトのCtrl-C


22

スクリプトが中断されるように、またスクリプトによって起動されている現在実行中のコマンドと同様に、bashスクリプトにctrl+ c処理を実装するにはどうすればよいですか?

(長期実行コマンドを実行するスクリプトがあると想像してください。ユーザーはctrl+ cを押してコマンドを中断しますが、スクリプトは続行します。)両方とも強制終了されるように動作する必要があります。


1
OSでジョブ制御が有効になっている場合、別のオプションはそのスクリプトを停止することです(通常はcrtl-zを使用)。バックグラウンドでそのジョブを続行しbgたり、終了したり、フォアグラウンドで続行したりできfgます。bashのマンページのセクションを参照してくださいJOB CONTROL
ott--

回答:


25

これを行うには、SIGINTを受け取ったときに呼び出すサブルーチンを作成し、実行する必要がありますtrap 'subroutinename' INT

例:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0

2
またEXIT、スクリプトの停止方法に関係なく、スクリプトの終了時にいつでも実行したいものがある場合にトラップすることができます。(KILLもちろん例外。)
Blrfl

まことにありがとうございます!ただし、「スリープ」が終了すると、シェルはトラップルーチンの実行中に次のコマンドを実行することができます。この場合は「エコー」...または私は間違っていますか?
kolypto

それは不可能であるべきです、いいえ。タスクを並行して実行しません。
クヴィーレ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.