Aynı komutu arka planda birden çok kez çalıştırın


14

Birden çok komutu çalıştırmak ve bash kullanarak arka plan oluşturmak nasıl mümkün olur?

Örneğin:

$ for i in {1..10}; do wait file$i &; done

bekle özel bir ikili.

Şu anda bir hata alıyorum:

syntax error near unexpected token `;'

Yukarıdaki komutu çalıştırırken.

Arka plan oluşturulduktan sonra komutlar paralel olarak çalışmalıdır.


1
Atıfta bulunmadığınız için ashuming yapıyorum: nohuparka planda bir komut yürütmenize izin verme
Dave Hamilton

3
Hata Sen gören kaynaklanmaktadır &ve ;hem "komutu sonlandırıcılar" dir. Her ikisini de kullanmanıza gerek yok: for ...; do wait $arg & doneçalışacak.
glenn jackman

@glenn jackman. Evet, aslında soruyu gönderdikten sonra denedim. İkisine de gerek yok; ve
Sebi

3
Gelecek okuyucular için, belgeleri için bir bağlantı :;, '&' '&&' ya da '||', ve isteğe bağlı olarak sona erdirildi ' "bir liste operatörleri tarafından ayrılan bir veya daha fazla boru hatları dizisidir bir ';', '&' veya bir yeni satır. (Vurgu mayın)
Glenn Jackman

Yanıtlar:


21

&, Tıpkı ;bir olan liste sonlandırıcı operatörü. Aynı sözdizimine sahiptirler ve birbirlerinin yerine kullanılabilirler (ne yapmak istediğinize bağlı olarak). Bu command1 &; command2, tek ihtiyacınız olan veya ihtiyacınız olmadığı anlamına gelir command1 & command2.

Yani, örneğin, sadece şunu yazabilirsiniz:

for i in {1..10}; do wait file$i & done

ve her waitkomut arka planda başlatılacak ve döngü hemen bir sonrakine geçecektir.


4

Uyumluluk uğruna genişletme yerine posix formunu kullanın:

for i in $(seq 1 10); do (./wait file$i &); done

1
Bunun seqbir POSIX komutu olmadığını ve genellikle yalnızca GNU sistemlerinde bulunduğunu unutmayın. Davranış veya $(...)(ve $i) öğesinin geçerli değerine bağlıdır $IFS. Ayrıca yaparak unutmayın (cmd &), cmdsen bekle ve örneğin onun çıkış durumu elde etmek mümkün olmayacaktır böylece, bir kabuktaki bir çocuk olacak.
Stéphane Chazelas

2

Komutları gruplandırabilir ve gruplandırılmış komutları arka plana koyabilirsiniz. Sevmek :

$ for i in {1..10}; do ((wait file$i)&); done

İç parantez kullanmaya gerek yoktur ...
marc

iç parantezleri yalnızca arka planda soruda sorulduğu gibi birden çok komut koymak istiyorsanız kullanmanız gerekir. Like ((uyku 1; bekleme dosyası $ i) &);
mazs

2

İkili adınız gerçekten adlandırılmış waitmı? Bunu tavsiye etmiyorum, çünkü waitbir kabuk yerleşik.

Bash'ın arka plan süreçlerini başlatan tek satırlık bir döngüyü iyi ayrıştırmadığına inanıyorum. Kodu şu şekilde değiştirmenizi öneririm:

$ for i in {1..10}; do ./wait file$i & echo "Running 'wait' using PID=$!..."; done
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.