Gunakan & (ampersand) dalam satu lingkaran bash loop

58

Saya telah berhasil menggunakan perintah ini, yang mengubah variabel dalam file konfigurasi kemudian mengeksekusi skrip Python dalam satu loop:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py; done

Karena masing-masing DoMyScript.pysendiri membutuhkan waktu sekitar 30 detik untuk dijalankan sebelum diakhiri, saya ingin memindahkannya ke latar belakang sementara yang berikutnya dapat muncul.

Saya sudah mencoba apa yang saya kenal, dengan menambahkan ampersand seperti di bawah ini:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py &; done

Namun, ini menghasilkan kesalahan di bawah ini:

-bash: kesalahan sintaksis dekat token yang tidak diharapkan `; '

ljs.dev
sumber

Jawaban:

85

Jatuhkan ;setelah &. Ini adalah persyaratan sintaksis

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
iruvar
sumber
1
Sialan, 43 detik terlalu lambat :)
Martin von Wittich
2
@MartinvonWittich, +1 untuk jawaban Anda dengan rasa simpati ;-)
iruvar
4
Sementara itu menjawab pertanyaan, itu mungkin bukan apa yang diinginkan OP seperti pada saat semua contoh python telah dimulai dan menginisialisasi mereka semua akan melihat numbers.txtmengandung 255.
Stéphane Chazelas
1
Setuju dengan @StephaneChazelas, tetapi saya tidak yakin apa yang dapat kita lakukan dengan informasi yang diberikan dalam pertanyaan. Solusi yang tepat untuk itu mungkin membutuhkan lebih banyak konteks.
CVn
3
Inilah referensi manual bash: gnu.org/software/bash/manual/bashref.html#Lists
glenn jackman
14

Mengingat komentar Stephane pada jawaban 1_CR , Anda mungkin ingin:

for i in {114..255}; do { echo $i > numbers.txt && python DoMyScript.py; } & done
glenn jackman
sumber
Terima kasih Glenn. Saya mencoba beberapa variasi kode Anda yang saya suka karena peningkatan keterbacaan, tetapi mungkin karena tidur tambahan yang saya butuhkan, itu tidak berhasil bagi saya. Itu juga akan mengulangi angka terakhir dalam forkisaran ... Inilah yang saya senangi saat ini: for((i=1;i<100;i+=1)); do echo $i > numbers.txt;sleep 3; python DoMyScript.py & doneTitik pertanyaan utama untuk mendapatkan proses untuk mengeksekusi di latar belakang terpecahkan.
ljs.dev
* tentu saja, saya ada <=di pertanyaan awal, jadi kisaran yang Anda berikan benar-benar cocok berdasarkan info yang saya berikan. Sekali lagi, terima kasih atas pendekatan yang berbeda
ljs.dev
10

Kalah ;:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
Martin von Wittich
sumber