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 ';'

co to jest pojedyncze „polecenie”? Linia bashu?
Oluf Lorenzen


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 &

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 ) &

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 & 

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