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


35

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

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

ただし、すべてを停止する場合は、Control-Cを押します。それはrsyncを停止しますが、それから次のものに行き続けます。この場合、私は何が起こったかを理解し、その後、物事が再び機能するまで、単に狂人のようにControl-Cを押します。

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


6
デニスの答えは正しいものですが、あなたがそうしなかったなら、あなたは「狂人のようにそれを押す」必要はありません、ただそれを保持し、キーボードがそれを繰り返し処理するようにします:-)
カイル・ブラント

私は常にCntl-Cを押し続けるだけで、通常は正常に動作します。
スコットアランミラー

回答:


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

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


4
追加のヒント:ネストされたループにいて、完全に終了する場合は、使用しますbreak 2(または、「2」を終了するネストされたループの数に置き換えます)。
ドーランアンテヌッチ



6

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

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

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

rsync -a * example.com:somewhere/


0

簡単に中断できる別のコマンドをループに入れる傾向があります。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の変更を監視している場合に便利です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.