Bash'taki komut listesinin geri kalanını nasıl iptal edebilirim?


10

Bash'de bazen bir komut listesi yazacağım ve vuracağım Enterve ancak daha sonra listenin sonuna yakın bir komutla ilgili bir hata olduğunu fark edeceğim . Ctrl+ Tuşuna basarsam Co anda çalışan komutu sonlandıracağını ve listenin geri kalanını iptal edeceğini biliyorum . Listenin geri kalanını iptal etmek için herhangi bir yolu var mı olmadan o anda çalışan komutu sonlandırma?

Örneğin, şöyle bir şey yazdığımı varsayalım:

foo; bar

veya

foo && bar

Burada foo, kesintiye uğramamanın çok önemli olduğu ve bargeri döndürülemez ve istenmeyen bir şey yaptığı ( shutdown -h nowya da diyelim rm -rf /) uzun süredir devam eden bir komut var . fooHala çalışıyor olsa da, kabuğa foobitmesine izin vermesini ancak bardaha sonra çalışmamasını söylemenin genel bir yolu var mı? (Evet, izinleri değiştirebilirim, barböylece çalıştırılabilir değil, ancak bu arada kullanmak istediğim bir barşey varsa , rmbu da benim için uygun değilse barveya baryerleşik değilse işe yaramaz .)


Son barkomutu, yürütülmeden önce some_command: olarak değiştirebilirsiniz ^bar^some_command.
GAD3R

3
@ GAD3R: ancak bu geçerli satırı değiştirmez, yeni bir satır başlatır.
Arkadiusz Drabczyk

Yanıtlar:


3

CtrlZProgramı arka plana kaydırmak için kullanmanın hile yaptığını gözlemledim .

foo && bar

@Arkadiusz Drabczyk'e foo; bargerekli kontrolü vermeyen yorumlarda gösterdiği için teşekkürler .

Sonra:

^Z

[1]+  Stopped                 foo

Komut yalnızca ilk görevi durdurur ve

fg %1

Bu, yalnızca görevi fooön plana getirir ve görevi tamamlar ve çıkar.

Not: Bu, bir dosyaya yazılan iki komut dosyası ile kontrol edilebilir. İlki birkaç saniye uyur ve geri konulması için zaman verir.

Neden CtrlZsadece komutun çalıştığını ve geri kalanını bıraktığım için kayboldum . Bilmek isterdim.


1
Onu çoğaltamıyorum. Hangi bashsürümü kullanıyorsunuz? Ben kullanıyorum GNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu). Farklı dosyalara yazılan 2 bash betiği yazdım write1.sh:: pastebin.com/rbKmdWgB ve write2.sh: pastebin.com/bNx3VRws . Ben onları böyle çalıştırın: ./write1.sh ; ./write2.sh. İlk senaryo wrote 1birkaç kez yankılanıyor , basıyorum C-z, diyor [1]+ Stopped ./write1.shve ikinci senaryonun çıktısını hemen görebiliyorum: wrote 2tekrar tekrar yankılanıyor.
Arkadiusz Drabczyk

2
Bu yöntemin command1 && command2boru hatları ile çalışmasının sebebinin sürece sinyal Control-zgöndermesi olduğunu düşünüyorum SIGCHLD. İle kontrol edilebilir echo $?. Bashilk işlemin başarıyla tamamlanmadığını ve sonraki işlemleri yürütmediğini görür.
Arkadiusz Drabczyk

Kullanıyorum GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16). Evet, bence haklısın. foo; baristenilen şekilde kontrol edilemez. Ancak Ctrl+Z, komutun çalıştırılması durumunda ikinci işlemin gerekli durdurmasını yapabiliriz foo && bar. Cevabı güncelleyeceğim. Bu konuya işaret ettiğiniz için teşekkür ederiz.
Revanth Chetluru

@ArkadiuszDrabczyk Ctrl-Z SIGTSTP göndermiyor mu?
muru

@RevanthChetluru notu barhala askıya alındı ​​ve jobsçıktıda görünüyor, bu yüzden muhtemelen de öldürülmesi gerekiyor.
muru
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.