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.