次のようなスクリプトがあります。
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
を停止して、スクリプト自体を終了しますか?
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ドキュメント を参照してください。