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ń.

bougui
źródło
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
gammay
źródło
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
sogart
źródło
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,