Qual è la differenza tra la doppia e commerciale (&&) e il punto e virgola (;) in Linux Bash?


112

Qual è la differenza tra e commerciale e punto e virgola in Linux Bash ?

Per esempio,

$ command1 && command2

vs

$ command1; command2


9
Per quanto riguarda l'off-topic, l'ultima volta che ho controllato, bash era ancora un linguaggio di programmazione, ma prima mi sbagliavo e potrebbe essere una caramella alla frutta secca.
Steve K

Lo è, e se facessi una domanda su un comportamento specifico o sul modo giusto di fare una certa cosa, sarebbe sicuramente in tema. Questo rientra in una categoria più grigia di "domanda sulla sintassi di un linguaggio" che non è chiaramente una questione di "programmazione" per quanto mi riguarda.
Etan Reisner

4
bash è per certi versi secco e per certi versi dolce. Alla fine della giornata è abbastanza piacevole e digeribile. Tuttavia, non può essere facilmente rubato ai bambini.
code_monk

Risposte:


139

L' &&operatore è un operatore booleano AND: se il lato sinistro restituisce uno stato di uscita diverso da zero, l'operatore restituisce quello stato e non valuta il lato destro (va in cortocircuito), altrimenti valuta il lato destro e restituisce il suo stato di uscita . Questo è comunemente usato per assicurarsi che command2venga eseguito solo se command1eseguito correttamente.

Il ;token separa solo i comandi, quindi eseguirà il secondo comando indipendentemente dal fatto che il primo abbia successo o meno.


6
la doppia e commerciale è &&diversa da una singola e commerciale &in bash?
Charlie Parker

16
@CharlieParker &fa sì che il comando venga eseguito in background, quindi sì. "Esegui questo comando in background" è molto diverso da "esegui questo comando successivo solo se questo altro ha esito positivo".
cdhowie

Il comando2 eseguirà solo comando1 che ha restituito lo stato di uscita zero , il che significa che è terminato correttamente ..
Nik

Fa ;ancora attendere per il primo comando per finire?
rfii

@rfii Sì, ma esegue il secondo comando senza considerare se il primo comando è riuscito. a;bsignifica "corri ae poi corri b". a&&bsignifica "esegui a, quindi esegui bsolo se ha aavuto successo".
cdhowie

33

comando1 && comando2

command1 && command2viene eseguito command2se (e solo se) l' command1esecuzione finisce con successo. In gergo Unix, ciò significa codice di uscita / codice di ritorno uguale a zero.

comando1; comando2

command1; command2viene eseguito command2dopo l'esecuzione command1, in sequenza. Non importa se i comandi hanno avuto successo o meno.


6

La prima è una logica semplice che ANDutilizza la valutazione del cortocircuito, la seconda delimita semplicemente due comandi.

Ciò che accade nella realtà è che quando il primo programma restituisce un codice di uscita diverso da zero, ANDviene valutato l'intero FALSEe il secondo comando non verrà eseguito. Il secondo li esegue semplicemente entrambi in ordine.

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.