Jak można uruchamiać wiele poleceń i wykonywać je w tle za pomocą bash?
Na przykład:
$ for i in {1..10}; do wait file$i &; done
gdzie czekanie jest niestandardowym plikiem binarnym.
W tej chwili pojawia się błąd:
syntax error near unexpected token `;'
podczas uruchamiania powyższego polecenia.
Po umieszczeniu w tle polecenia powinny działać równolegle.
nohup
pozwalając ci wykonać polecenie w tle&
i;
oba są „terminatorami poleceń”. Nie musisz używać obu:for ...; do wait $arg & done
będzie działać.Odpowiedzi:
&
, Tak jak;
jest to lista terminator operator. Mają tę samą składnię i mogą być używane zamiennie (w zależności od tego, co chcesz zrobić). Oznacza to, że nie chcesz ani nie potrzebujeszcommand1 &; command2
, wszystko czego potrzebujesz tocommand1 & command2
.W twoim przykładzie możesz po prostu napisać:
a każde
wait
polecenie zostanie uruchomione w tle, a pętla natychmiast przejdzie do następnego.źródło
Ze względu na kompatybilność użyj formy posiksowej zamiast rozszerzenia:
źródło
seq
nie jest to polecenie POSIX i ogólnie można go znaleźć tylko w systemach GNU. Zachowanie lub$(...)
(i$i
) zależy od bieżącej wartości$IFS
. Należy również pamiętać, że robiąc(cmd &)
,cmd
będzie dzieckiem podpowłoce, więc nie będą mogli poczekać i uzyskać jego status wyjścia na przykład.Możesz pogrupować polecenia i umieścić zgrupowane polecenia w tle. Lubić :
źródło
Czy Twój plik binarny naprawdę ma nazwę
wait
? Nie polecam tego robić, ponieważwait
jest to wbudowana powłoka.Uważam, że bash nie analizuje dobrze pętli jednowierszowej, która uruchamia procesy w tle. Sugeruję zmianę kodu na:
źródło