web-dev-qa-db-ja.com

Bashループ-コマンド内でControl-Cを押すとループを停止する方法

いくつかのディレクトリをrsyncしています。私はbashターミナルを開いており、次のようなものを実行しています:

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

ただし、すべてを停止したい場合は、Ctrlキーを押しながらCキーを押します。これによりrsyncが停止しますが、次のrsyncに進み続けます。この場合、私は何が起こったのかを理解し、問題が再び解決するまで、狂人のようにControl-Cを押します。

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

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

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

35
Kenster

デニスの答えをさらに詳しく説明すると、コードは次のようになります。

trap "echo Exited!; exit;" SIGINT SIGTERM

実際の例(たまたまrsyncが関係している)については、 http://Gist.github.com/279849 を確認してください。

28

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

trap <command> SIGINT

control-Cが押されたときにcommandを実行します。 trapステートメントをスクリプト内のどこかに有効にしたい場所に置くだけです。

  1. 押す Ctrl-Zスクリプトを一時停止します;
  2. kill %%

この答え のクレジット、説明、詳細。

コマンドの文字列を括弧内に入れると、文字列は単一のプロセスとして機能し、SIGINTを受け取り、ヒットすると終了します Ctrl-C

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

だが! rsyncコマンドの場合、複数のソースが許可されるため、記述したコードは次のように記述されます。

rsync -a * example.com:somewhere/
6
amphetamachine

簡単に中断できる別のコマンドをループに入れる傾向があります。 2つのctrl-Cを押す必要があります。

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

これは、このrsyncの優れたソリューションではありません。おそらく、すぐに実行する必要があります。ただし、次のような他のループではうまく機能します。

while true ; do ping -c 10 example.com ; sleep 1 ; done

このループはループを実行するたびにexample.comのアドレスを再検索します。これは、DNSの変更を監視している場合に役立ちます。

0
Alan Porter