Suppongo che tu voglia questo:
myCommand1 & myCommand2 &
Questo si avvia myCommand1
e lo invia allo sfondo mentre è seguito dalla e commerciale, quindi si avvia immediatamente myCommand2
e lo invia anche allo sfondo, rilasciando quindi nuovamente la shell.
elenchi
Per una migliore comprensione è possibile sostituire la pipeline con il comando qui.
Un elenco è una sequenza di una o più condotte separate da uno degli operatori ; , & , && o || e facoltativamente terminato da uno dei
; , & , o .
Se un comando viene terminato dall'operatore di controllo & , la shell esegue il comando in background in una subshell. La shell non attende il completamento del comando e lo stato di ritorno è 0. Comandi separati da a ; vengono eseguiti in sequenza; la shell attende che ciascun comando termini a sua volta. Lo stato di ritorno è lo stato di uscita dell'ultimo comando eseguito.
Gli elenchi AND e OR sono sequenze di una o più condotte separate da && e || operatori di controllo, rispettivamente.
Fonte:man bash
Dividiamolo in esempi. È possibile creare un elenco combinando i comandi e separandoli con uno di questi ; & && ||
::
command1 ; command2 # runs sequentially
command1 && command2 # runs sequentially, runs command2 only if command1 succeeds
command1 || command2 # runs sequentially, runs command2 only if command1 fails
command1 & command2 # runs simultaneously
È possibile terminare le liste con uno di questi: ; & <newline>
.
Normalmente si esegue un comando o un elenco premendo Enter, che equivale <newline>
. Il punto e virgola ha ;
lo stesso scopo, specialmente negli script. La e commerciale &
tuttavia avvia i comandi in una subshell in background, rilasciando immediatamente la shell.
Puoi usare ()
parentesi tonde o ricci {}
per ulteriori elenchi di gruppi, con la differenza che le parentesi tonde generano una sottostruttura e quelle ricci no. Le parentesi graffe richiedono uno spazio dopo la prima e un punto e virgola o una nuova riga prima della parentesi di chiusura. Per esempio:
# if c1 succeeds start a shell in the background
# and run c2 and c3 sequentially inside it
c1 && ( c2 ; c3 ) &
# run c1 and if it succeeds c2 sequentially as a group command
# if c1 or c2 fail run c3 in the background
{ c1 && c2 ;} || c3 &
Questo può diventare piuttosto complicato, se non si è sicuri dell'uso true
e false
per verificare se la costruzione funziona come previsto:
$ { true && true ;} || echo 2
$ { true && false ;} || echo 2
2
Controllo del lavoro
Il jobs
comando visualizza un elenco dei lavori in background in esecuzione o che sono stati recentemente completati nella shell corrente. Esistono numerose scorciatoie da tastiera e comandi per il controllo dei lavori:
- Ctrl+ Zdigita il carattere di sospensione che provoca l'arresto del processo attualmente in esecuzione in primo piano, non viene terminato, ma rimane
jobs
nell'elenco
- Ctrl+ Ydigita il carattere di sospensione ritardata che provoca l'arresto del processo attualmente in esecuzione in primo piano quando tenta di leggere l'input dal terminale
fg
= %
porta un processo in primo piano avviandolo se necessario, è possibile specificare il processo come segue:
% # last process in the jobs list
%1 # 1st process in the jobs list
%abc # process beginning with the string “abc”
%?abc # process containing the string “abc” anywhere
bg
= %&
prende un processo in background avviandolo se necessario:
%& # last process in the jobs list
%1& # 1st process in the jobs list
%abc& # process beginning with the string “abc”
%?abc& # process containing the string “abc” anywhere
wait
attende il completamento di un processo in background e restituisce il suo stato di terminazione:
wait %1 # 1st process in the jobs list
Immagina di aver avviato un lungo processo ( jobs
rivela il numero 3) e poi renditi conto che vuoi che il computer venga sospeso al termine, più echo
un messaggio se il processo non è riuscito:
wait %3 || echo failed ; systemctl suspend