Praca w tle w pętli


81

Próbuję uruchomić zadanie w tle w pętli for w bash:

for i in $(seq 3); do echo $i ; sleep 2 & ; done

Pojawia się błąd:

bash: syntax error near unexpected token `;'

W zsh działa linia poleceń.


3
Który fragment próbujesz umieścić w tle? jak czytasz, próbujesz spać w tle, co byłoby bezcelowe ..
BugFinder

4
sen to tylko przetestowanie mojej pętli przed prawdziwym przypadkiem.
bougui

Odpowiedzi:


124

Usunąć ; po śnie

for i in $(seq 3); do echo $i ; sleep 2 & done

Przy okazji, takie pętle lepiej pisać w osobnych wierszach z odpowiednim wcięciem (jeśli piszesz to w pliku skryptu powłoki).

for i in $(seq 3)
do
   echo $i
   sleep 2 &
done

4
Pamiętaj, że wyśle ​​„uśpienie 2” tylko do tła.
tamerlaha

Dlaczego tak się dzieje, gdy robię to z poleceniem działającym $iw tle, a kontrola zadań mówi, że nazwa procesu zawiera $izamiast tego, jaka była rzeczywista wartość $i?
Michael

@Michael Pełny program z danymi wyjściowymi pomógłby lepiej zrozumieć
gammay

for I in <whatever>; do rm -fr $I & done... jobs-> rm -fr $Ikilka razy, zamiast usuwać rzeczywisty katalog dla każdego zadania
Michael

Mam na to odpowiedź, jest długa. Więc myślę, że powinieneś opublikować to jako nowe pytanie (i dodać link do pytania tutaj), odpowiem i otrzymasz więcej odpowiedzi.
gammay

42

Możesz umieścić polecenie w tle w ()

for i in $(seq 3); do echo $i ; (sleep 2 &) ; done

10
Uwaga: w ten sposób tworzysz podpowłokę. Oznacza to również, że nie będzie można waitzakończyć zadań w tle.
JFK,
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.