web-dev-qa-db-ja.com

Ctrl + Cを使用して、現在のコマンドだけでなくスクリプト全体を停止する方法

次のようなスクリプトがあります。

for ((i=0; i < $srccount; i++)); do
    echo -e "\"${src[$i]}\" will be synchronized to \"${dest[$i]}\""
    echo -e $'Press any key to continue or Ctrl+C to exit...\n' 
    read -rs -n1
    rsync ${opt1} ${opt2} ${opt3} ${src[$i]} ${dest[$i]}
done

押すと Ctrl+C 読み取りコマンドに応答して、スクリプト全体が停止しますが、を押すと Ctrl+Crsyncコマンドの実行中は、現在のrsyncコマンドだけが停止し、スクリプトはforループを続行します。

ユーザーが押したかどうかをスクリプトに伝える方法はありますか Ctrl+Crsyncの実行中に、rsyncを停止して、スクリプト自体を終了しますか?

15
PHP Learner

Ctrl+C 割り込み信号SIGINTを送信します。 trapビルトインを介して、このシグナルを受信したときに終了するようにbashに指示する必要があります。

trap "exit" INT
for ((i=0; i < $srccount; i++)); do
    echo -e "\"${src[$i]}\" will be synchronized to \"${dest[$i]}\""
    echo -e $'Press any key to continue or Ctrl+C to exit...\n' 
    read -rs -n1
    rsync ${opt1} ${opt2} ${opt3} ${src[$i]} ${dest[$i]}
done

シグナルを受信したときに終了するだけではなく、実質的に多くのことができます。通常、一時的なファイルのクリーンアップはシグナルハンドラで行われます。詳細については、 bashドキュメント を参照してください。

16
bishop