Jak można uruchomić wiele programów w tle za pomocą jednego polecenia?

36

Jak można uruchomić wiele programów w tle za pomocą jednego polecenia?

Próbowałem poniższych poleceń, ale one nie działają.

nohup ./script1.sh & && nohup ./script2.sh &
-bash: syntax error near unexpected token '&&'

nohup ./script1.sh & ; nohup ./script2.sh &
-bash: syntax error near unexpected token ';'
Rahul Patil
źródło
co to jest pojedyncze „polecenie”? Linia bashu?
Oluf Lorenzen
1
stackoverflow.com/questions/14612371/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Być może brakuje mi czegoś oczywistego, ale && oznacza znajomość kodu wyjścia z poprzedniego polecenia. Jeśli to zrobisz w tle, kod wyjścia nie będzie znany. Jaka była tam funkcjonalna potrzeba?
Richlv

Odpowiedzi:

32

Z punktu widzenia składni powłoki &rozdziela polecenia takie jak ;/ |/ &&... (choć oczywiście z innym semantycznym). Więc to tylko:

cmd1 & cmd2 & cmd3 &
Stéphane Chazelas
źródło
1
to nie jest / całkiem / słuszne, ;uruchamia następne polecenie, jak tylko zakończy się pierwsze. &faktycznie umieszcza polecenie w tle. po prostu spróbuj tego:echo foo & echo bar & echo test &
Oluf Lorenzen
1
@Finkregh, oczywiście. Nikt w to nie wątpi. Chodziło mi tylko o to, że oba oddzielają polecenia (z punktu widzenia składni) bez wpływu na sposób ich działania.
Stéphane Chazelas
To nie do końca to, o co pytano, ponieważ pytanie określało wydanie „pojedynczego polecenia”. Moja odpowiedź również nie jest taka, ponieważ jest to również seria poleceń, ale zawiera co najmniej jedną semanty pojedynczego polecenia w tym, że dane wyjściowe są połączone, mogą zostać przekierowane itp.
Eli Heady
„Wiele poleceń za pomocą jednego polecenia” wydaje się jednak oksymoronem - co to znaczy? Jeśli tak jest sudo, możesz wprowadzić hasło tylko raz, zawiń je bash -club w podobny sposób.
Richlv
12

Sekcja strony podręcznika bash, zatytułowana „ Polecenia złożone”, ma dwie opcje, które mogłyby działać, wyświetlać i grupować polecenia.

Polecenie grupowe to seria poleceń zamkniętych w nawiasy klamrowe {}. Lista jest taka sama, ujęta w nawiasy (). Oba mogą być użyte do tła wielu poleceń w tle, a wreszcie do tła całej kolekcji jako zestawu. Konstrukcja listy wykonuje polecenia w podpowłoce, więc przypisania zmiennych nie są zachowywane.

Aby wykonać grupę poleceń:

{ command1 & command2 & } &

Możesz także wykonywać swoje polecenia na liście (podpowłoce):

( command1 & command2 ) &
Eli Heady
źródło
1
Nie ma za co. Dodałem link do instrukcji. Zauważ, że ()składnia listy wykonuje zamknięte polecenia w podpowłoce, więc zmienne nie są zachowywane.
Eli Heady
3

Inny sposób:

$(command1 &) && command2 & 
Zatoka Perska
źródło
Nie, uruchomi pierwsze polecenie, a następnie najpierw skończy, a następnie uruchomi inne polecenie
Rahul Patil
użyłeś &&w swoim pytaniu, to znaczy najpierw uruchom komendę, a następnie, jeśli uruchomisz pomyślnie, uruchom następną komendę. jeśli nie uważasz, możesz uruchomićcommand1 & ; command2 & ;
PersianGulf
pierwsze polecenie z powodzeniem przechodzi w bg lub uruchamia się ;bez problemu z tym
Rahul Patil