Jalankan perintah yang sama beberapa kali di latar belakang

14

Bagaimana mungkin menjalankan banyak perintah dan melatarinya menggunakan bash?

Sebagai contoh:

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

di mana menunggu adalah biner khusus.

Saat ini saya mendapatkan kesalahan:

syntax error near unexpected token `;'

saat menjalankan perintah di atas.

Setelah di latar belakang, perintah harus dijalankan secara paralel.

Sebi
sumber
1
Apakah mengasumsikan Anda tidak merujuk pada: nohupmemungkinkan Anda untuk mengeksekusi perintah di latar belakang
Dave Hamilton
3
Kesalahan yang Anda lihat adalah karena &dan ;keduanya "terminator perintah". Anda tidak perlu menggunakan keduanya: for ...; do wait $arg & doneakan bekerja.
glenn jackman
@glenn jackman. Ya, saya benar-benar mencobanya setelah memposting pertanyaan. Tidak perlu keduanya; dan &
Sebi
3
Untuk pembaca di masa mendatang, tautan ke dokumentasi : "Daftar adalah urutan satu atau lebih saluran pipa yang dipisahkan oleh salah satu operator ';', '&', '&&', atau '||', dan secara opsional diakhiri oleh satu dari ';', '&', atau baris baru. " (penekanan milikku)
glenn jackman
stackoverflow.com/q/14753491/560648
Lightness Races with Monica

Jawaban:

21

The &, seperti ;adalah daftar terminator operator. Mereka memiliki sintaks yang sama dan dapat digunakan secara bergantian (tergantung pada apa yang ingin Anda lakukan). Ini berarti bahwa Anda tidak ingin, atau butuh, yang command1 &; command2Anda butuhkan hanyalah command1 & command2.

Jadi, dalam contoh Anda, Anda bisa menulis:

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

dan setiap waitperintah akan diluncurkan di latar belakang dan loop akan segera beralih ke yang berikutnya.

terdon
sumber
4

Demi kompatibilitas gunakan formulir posix alih-alih ekspansi:

for i in $(seq 1 10); do (./wait file$i &); done
marc
sumber
1
Perhatikan bahwa seqini bukan perintah POSIX dan umumnya hanya ditemukan pada sistem GNU. Perilaku atau $(...)(dan $i) tergantung pada nilai saat ini dari $IFS. Perhatikan juga bahwa dengan melakukan (cmd &), cmdakan menjadi anak dari subkulit, jadi Anda tidak akan bisa menunggu dan mendapatkan status keluarnya misalnya.
Stéphane Chazelas
2

Anda dapat mengelompokkan perintah dan meletakkan perintah yang dikelompokkan di latar belakang. Suka :

$ for i in {1..10}; do ((wait file$i)&); done
labirin
sumber
Tidak perlu menggunakan tanda kurung bagian dalam ...
marc
hanya perlu menggunakan tanda kurung bagian dalam jika Anda ingin memasukkan beberapa perintah latar belakang seperti yang diminta dalam pertanyaan. Suka ((sleep 1; tunggu file $ i) &);
mazs
2

Apakah biner Anda benar-benar bernama wait? Saya tidak merekomendasikan untuk melakukannya, karena waitshell builtin.

Saya percaya bash tidak menguraikan dengan baik satu baris loop yang meluncurkan proses latar belakang. Saya menyarankan Anda untuk mengubah kode ke:

$ for i in {1..10}; do ./wait file$i & echo "Running 'wait' using PID=$!..."; done
Anderson Medeiros Gomes
sumber