Bash ループ - コマンド内で Control-C を押したときにループを停止するにはどうすればよいですか?

Bash ループ - コマンド内で Control-C を押したときにループを停止するにはどうすればよいですか?

いくつかのディレクトリを rsync しています。bash ターミナルを開いて、次のようなコマンドを実行しています。

for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done

ただし、すべてを停止したい場合は、Control-C を押します。これにより rsync は停止しますが、次の rsync に進みます。この場合、何が起こったのかを認識し、再び機能するまで狂ったように Control-C を押します。

これを「修正」する方法はありますか。このようなループがある場合に、Control-C を押すと、bash シェルに戻るようにしたいです。

答え1

for DIR in * ; do rsync -a $DIR example.com:somewhere/ || break; done

何らかの理由で個々の rsync 実行が失敗した場合も、ループが終了します。

答え2

Dennis の回答を拡張すると、コードは次のようになります。

trap "echo Exited!; exit;" SIGINT SIGTERM

実際の例(rsyncを含む)については、以下を参照してください。出典: http://www.github.com/279849

答え3

Control-C にトラップを設定できます。

trap <command> SIGINT

commandControl-C が押されたときに が実行されます。trapスクリプト内の、有効にしたい場所にステートメントを配置するだけです。

答え4

括弧内にコマンドの文字列を入力すると、その文字列は単一のプロセスとして動作し、Ctrl-を押すと SIGINT を受信して​​終了しますC

(for DIR in * ; do rsync -a "$DIR" example.com:somewhere/ ; done)

しかし、コマンドの場合はrsync複数のソースが許可されるため、記述したコードは次のように記述した方がよいでしょう。

rsync -a * example.com:somewhere/

関連情報