Come faccio a concatenare i comandi sulla console?


23

In bash, a volte voglio eseguire diversi comandi in seriale e non voglio aspettare che finiscano prima di digitare quelli nuovi. Quindi faccio qualcosa del genere:

cmd1; cmd2; cmd3

Sfortunatamente, uno dei comandi potrebbe non riuscire. In tal caso, vorrei smettere. C'è un modo semplice per farlo, ma farlo in modo da continuare a eseguire i comandi solo se il comando precedente aveva un codice di uscita 0?


Ecco una grande risposta da Unix SE.
NonlinearFruit

Risposte:


39

Usa &&operatore,

cmd1 && cmd2 && cmd3

Nella shellscripting &&e gli ||operatori sono modellati dopo l'implementazione ottimizzata degli operatori logici in C. &&significa operatore AND e ||mezzo OR. Unix è strettamente correlato a C e in C il secondo operando di operatori logici non viene valutato se il risultato è già noto dal primo operando. Ad esempio "false && x"è falseper qualsiasi x, quindi non è necessario valutare x(soprattutto se si xtratta di una chiamata di funzione); allo stesso modo per "true || x". Questo è anche chiamato semantica di corto circuito .

E in Unix, è tradizionale interpretare i valori restituiti dai comandi come valori di verità "completamento riuscito": codice di uscita 0 significa true(successo), mezzo diverso da zero false(fallimento). Quindi, quando viene cmd1 && cmd2restituito il primo comando "false"(stato di uscita diverso da zero, che indica un errore), lo stato del comando composto è noto: fallimento. Quindi l'interpretazione generale di cmd1 && cmd2 può essere: "esegui cmd1E POI, se non falliva cmd2". Qual è quello che sostanzialmente vuoi nella tua domanda.

Allo stesso modo con OR: cmd1 || cmd2può essere interpretato come "esegui cmd1, OR SE fallisce cmd2".


Protip: per catene più lunghe di &&, considera di inserire la set -etua sceneggiatura. In pratica cambia il punto ;e virgola in &&, con un paio di casi speciali.


1
+1 per la spiegazione||
Alp

puoi concatenare qualunque sia lo stato del primo comando? (successo o fallimento)
Hugo Trentesaux,

@HugoTrentesaux cosa vuoi dire? .. Il successo / risultato guasto o A || Bè proprio la stessa come il [cortocircuito] logica A o B . A || Bè successo quando è Astato successo o quando è Astato un fallimento ma è Bstato un successo ; ed A || Bè fallimento quando Aera fallimento ed Bera failure. Allo stesso modo per &&, segue AND logico.
Ulidtko,

Nel contesto della shell, come posso eseguire A e poi B, indipendentemente dal fatto che A fallisca o abbia successo?
Hugo Trentesaux,

1
@HugoTrentesaux è quello che fa normalmente il normale ;(o newline). set -esi trasformerà ;in &&approssimativamente parlando. set +e[impostazione predefinita] si trasforma A; Bin ciò che dici: corri A, quindi non importa quale corsa B.
Ulidtko,

13

"Comandi concatenati e raggruppandoli"

ping 192.168.0.1 || { echo "ping not successful"; exit 1; }

ping, solo se non ha esito positivo, esegue il gruppo incatenato di comandi tra parentesi.

Attenzione:

L'elenco deve essere chiuso con un ";".

Ci devono essere spazi vuoti tra parentesi e comandi raggruppati!


6

Semplicemente con l' &&operatore. Per esempio:

cmd1 && cmd2 && cmd3

Se uno dei comandi fallisce (restituisce un valore di uscita diverso da 0), gli altri comandi non verranno eseguiti.

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.