Qual è la ragione per usare && invece di; posizionare ai comandi sulla stessa linea?


30

Non essendo un esperto in Linux, non in Unix, mi chiedo quale sia la differenza tra questi 2 metodi di stringa 2 comandi sulla stessa linea? Non vedo alcuna differenza nell'output in questo esempio semplicistico

Pete$date ; time
Sun Mar 17 19:37:20 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

Pete$date &&time
Sun Mar 17 19:37:46 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

Questo non ha causato alcun problema - sono solo curioso ..

Risposte:


43

&&è un "e" logico. Il primo argomento viene valutato e il secondo viene valutato solo se il primo restituisce true. Il motivo è che "false AND qualcosa" è sempre falso, quindi non è necessario valutare il secondo argomento in questo caso.

Quindi, utilizzando &&si assicura che il secondo comando non venga eseguito se il primo segnala un errore ( trueè rappresentato dal codice di uscita 0, che indica che non si è verificato alcun errore). Al contrario, ;esegue entrambi i comandi, indipendentemente dal risultato del primo.

Conclusione: concatenare i comandi con &&è una buona abitudine. Al contrario ;, non eseguirà i comandi successivi se qualcosa è andato storto.


vuoi dire che 0significa trueo 0significa vero - c'è un errore?
Michael Butler,

1
@MichaelButler: 0significa true. Ho aggiunto un chiarimento.
Azimut,

26

;

Esegue in sequenza i comandi, indipendentemente dallo stato di uscita precedente:

# sh -c "exit 0" ; echo "2nd command"
2nd command
# sh -c "exit 1" ; echo "2nd command"
2nd command

&&

AND logico

Eseguire il comando successivo, ma solo se il comando precedente ha avuto esito positivo (lo stato di uscita era 0):

# sh -c "exit 0" && echo "2nd command"
2nd command
# sh -c "exit 1" && echo "2nd command"
#

||

OR logico

Eseguire il comando successivo, ma solo se il comando precedente non è riuscito (lo stato di uscita non era 0):

# sh -c "exit 0" || echo "2nd command"
#
# sh -c "exit 1" || echo "2nd command"
2nd command

6
Inoltre, sh -c "exit 0"può essere sostituito con truein questi esempi e sh -c "exit 1"con false.
Flimm,
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.