Come si possono eseguire più programmi in background con un singolo comando?


36

Come si possono eseguire più programmi in background con un singolo comando?

Ho provato i comandi seguenti, ma non funzionano.

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

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

che cos'è un singolo "comando"? Una linea di bash?
Oluf Lorenzen,


Potrei mancare qualcosa di ovvio, ma && implica la conoscenza del codice di uscita del comando precedente. Se lo sfondo, il codice di uscita non sarà noto. Qual era il bisogno funzionale lì?
Richlv,

Risposte:


32

Dal punto di vista della sintassi della shell, &separa i comandi come ;/ |/ &&... (anche se ovviamente con semantica diversa). Quindi è solo:

cmd1 & cmd2 & cmd3 &

1
questo non è / abbastanza / giusto, ;avvia il comando successivo non appena termina il primo. &in realtà mette il comando sullo sfondo. prova questo:echo foo & echo bar & echo test &
Oluf Lorenzen,

1
@Finkregh, ovviamente. Nessuno ne dubita. Volevo solo dire che separano entrambi i comandi (dal punto di vista della sintassi) senza implicazioni sul modo in cui vengono eseguiti.
Stéphane Chazelas,

Non è proprio quello che è stato chiesto, poiché la domanda specificava di emettere un "comando singolo". Né è la mia risposta, poiché anche una serie di comandi, ma ha almeno una semantica di un singolo comando in quanto l'output è concatenato, può essere reindirizzato, ecc.
Eli Heady

"Comandi multipli con un solo comando" sembra essere un ossimoro, ma cosa significa? Se questo è per qualcosa del genere sudo, puoi inserire la password una sola volta, quindi inserirla bash -co simile.
Richlv,

12

La sezione manpage di bash intitolata Comandi composti ha due opzioni che potrebbero funzionare, elencare e raggruppare i comandi.

Un comando di gruppo è una serie di comandi racchiusi tra parentesi graffe {}. Un elenco è lo stesso, racchiuso tra parentesi (). Entrambi possono essere utilizzati per eseguire il background di più comandi all'interno e infine per impostare l'intero set come set. Il costrutto elenco esegue i comandi in una subshell, quindi le assegnazioni delle variabili non vengono mantenute.

Per eseguire un gruppo di comandi:

{ command1 & command2 & } &

Puoi anche eseguire i tuoi comandi in un elenco (subshell):

( command1 & command2 ) &

1
Prego. Ho aggiunto il link al manuale. Si noti che la ()sintassi dell'elenco esegue i comandi racchiusi in una subshell, quindi le variabili non vengono conservate all'interno.
Eli Heady,

3

un altro modo:

$(command1 &) && command2 & 

No, eseguirà il primo comando quindi dopo aver terminato prima quindi eseguirà un altro comando
Rahul Patil

hai usato &&nella tua domanda, significa che inizialmente esegui un comando, quindi se eseguito con successo, esegui il comando successivo. Se non lo consideri, puoi eseguirecommand1 & ; command2 & ;
PersianGulf

il primo comando è andato a buon fine in bg, o eseguito ;senza problemi con questo
Rahul Patil
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.