Bash Döngü - Bir komut içinde Control-C tuşuna bastığımda döngü nasıl durdurulur?


35

Birkaç dizini karıştırıyorum. Açık bir bash terminalim var ve şunun gibi bir şey yürütüyorum:

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

Ancak her şeyi durdurmak istersem, Control-C tuşlarına basarım. Bu rsync'i durdurur, fakat sonra bir sonrakine gitmeye devam eder. Bu durumda ne olduğunu farkettim ve sonra işler tekrar işe yarayana kadar sadece bir çılgın adam gibi Control-C tuşlarına basın.

Bunu düzeltmenin bir yolu var mı? Öyle bir döngü varsa ve Control-C'ye basarsam, beni bash kabuğuma döndürecek şekilde istiyorum.


6
Dennis'in cevabı doğru cevap, ama eğer bunu yapmadıysanız, 'bir deli gibi basmak zorunda değilsiniz', sadece tutun ve klavyenin tekrar etmesine izin verin :-)
Kyle Brandt

Her zaman sadece Cntl-C tuşlarını basılı tutarım, genelde iyi çalışır.
Scott Alan Miller

Yanıtlar:


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

Bir nedenden dolayı ayrı bir rsync çalışması başarısız olursa bu da döngüden çıkar.


4
Ek ipucu: iç içe geçmiş bir döngü içindeyseniz ve tamamen sonlandırmak istiyorsanız, kullanın break 2(veya "2" yerine sonlandırmak istediğiniz iç içe geçmiş döngü sayısını kullanın).
Dolan Antenucci,


25

Control-C için bir tuzak ayarlayabilirsiniz.

trap <command> SIGINT

commandControl-C tuşuna basıldığında yürütülür . Sadece trapifadeyi betiğinizde, etkin olmasını istediğiniz bir yere yerleştirin.


6

Parantez içine bir komut dizisi koyduğunuzda, dizge tek bir işlem gibi hareket eder ve SIGINT'i alır ve vurduğunuzda sonlandırılır Ctrl- C:

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

Fakat! rsyncKomut durumunda, birden fazla kaynağa izin verir, bu nedenle yazdığınız kod şöyle yazılır:

rsync -a * example.com:somewhere/

6
  1. Ctrl-ZKomut dosyasını askıya almak için basın ;
  2. kill %%

Krediler, açıklamalar ve bu cevapta daha fazla ayrıntı .


Bu harika, çünkü zaten başlattığınız uzun süren bir döngüyü kesmek istediğinizde "post to facto" çalışıyor.
Nick Matteo,

0

Döngüme kolayca kesilebilecek başka bir komut daha koyuyorum. İki ctrl-C'ye basılmasını gerektirir.

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

Bu hızlı bir şekilde çalıştırmak isteyeceğiniz bu rsync için harika bir çözüm değil. Ancak bunun gibi diğer döngüler için de iyi çalışır:

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

Bu döngü, bir döngü değişikliğini izlemek için kullanışlıdır, bu döngü boyunca her zaman example.com adresini tekrar arayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.