Użyj & (ampersand) w jednowierszowej pętli bash


58

Z powodzeniem korzystam z tej komendy, która zmienia zmienną w pliku konfiguracyjnym, a następnie wykonuje skrypt w języku Python w pętli:

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

Ponieważ każda z nich DoMyScript.pypotrzebuje około 30 sekund, aby uruchomić się przed zakończeniem, chciałbym przenieść je w tło, podczas gdy następna będzie mogła się odrodzić.

Wypróbowałem to, co znam, dodając znak handlowe i jak poniżej:

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

Powoduje to jednak następujący błąd:

-bash: błąd składni w pobliżu nieoczekiwanego tokena `; '

Odpowiedzi:


85

Upuść ;po &. Jest to wymóg składniowy

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

1
Cholera, 43 sekundy za wolno :)
Martin von Wittich,

2
@MartinvonWittich, +1 do twojej odpowiedzi w drodze współczucia ;-)
iruvar

4
Chociaż to odpowiada na pytanie, prawdopodobnie nie jest to, czego chce OP, ponieważ zanim wszystkie instancje Pythona się uruchomią i zainicjują, wszystkie zobaczą numbers.txtzawierające 255.
Stéphane Chazelas,

1
Zgadzam się z @StephaneChazelas, ale nie jestem pewien, co naprawdę możemy z tym zrobić dzięki informacjom podanym w pytaniu. Właściwe rozwiązanie tego prawdopodobnie wymaga większego kontekstu.
CVn

3
Oto odniesienie do podręcznika bash: gnu.org/software/bash/manual/bashref.html#Lists
glenn jackman

14

Biorąc pod uwagę komentarz Stephane'a do odpowiedzi 1_CR , prawdopodobnie chcesz:

for i in {114..255}; do { echo $i > numbers.txt && python DoMyScript.py; } & done

Dzięki Glenn. Wypróbowałem kilka odmian twojego kodu, które lubię ze względu na zwiększoną czytelność, ale być może z powodu dodatkowego snu, którego potrzebowałem, nie działało to dla mnie. Powtórzyłoby to również ostatnią liczbę z forzakresu ... Oto, z czego jestem zadowolony w tej chwili: for((i=1;i<100;i+=1)); do echo $i > numbers.txt;sleep 3; python DoMyScript.py & doneGłówny problem związany z uruchomieniem procesu w tle został rozwiązany.
ljs.dev,

* oczywiście miałem <=w pierwotnym pytaniu, więc podany przez ciebie zakres był całkowicie odpowiedni na podstawie informacji, które podałem.
Jeszcze

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.