Quale è meglio: usare; o && per eseguire più comandi in una riga?

328

Nei tutorial e nelle istruzioni pratiche, vedo spesso comandi combinati. Ad esempio,

sudo apt-get update && sudo apt-get install pyrenamer

Sembra che ci siano quattro possibili connettori: & , && , || e ; . Anche se il connettore & mi è chiaro (invia un processo allo sfondo e lascia il terminale disponibile), non è chiaro quale sia la differenza tra && e ; . E non sapevo di || fino al commento di Kaya.

Le seguenti domande trattano la differenza tra i due connettori, ma lo fanno principalmente nei commenti:

Quindi ecco una serie di domande correlate:

  1. Qual è la differenza tra ; e && ?
  2. Quando dovresti usarli rispettivamente? Sarebbe bello vedere alcuni casi d'uso: se voglio eseguire un comando e poi dopo aver spento il mio computer, quale connettore dovrei scegliere?
  3. Quali sono i loro vantaggi e pericoli ? Robie Basak menziona in un commento a questa risposta che un comando come cd /somewhere_else; rm -Rf * può avere conseguenze distruttive se il primo elemento nella catena di comando non riesce, ad esempio.
  4. Se pertinente, da dove vengono?
posta don.joey 20.08.2013 - 18:41

4 risposte

595

Cheatsheet:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.
    
risposta data Jack 20.10.2014 - 13:02
77

&& esegue solo il secondo comando se il primo esce con stato 0 (ha avuto successo). ; esegue entrambi i comandi, anche se il primo esce con uno stato diverso da zero.

Il tuo esempio con && può essere parafrasato in modo equivalente come

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi
    
risposta data choroba 20.08.2013 - 18:46
28

L'utilizzo di ; eseguirà i comandi indipendentemente dal fatto che il primo comando abbia esito positivo o meno.

utilizzando && esegue il 2 ° comando solo quando il primo comando è stato eseguito correttamente (stato 0).

Entrambi sono usati in una prospettiva diversa. Come per un processo più lungo, ad esempio per un'installazione è necessario compilarlo e installarlo. dovresti make && make install . Quindi l'installazione verrà eseguita solo se make ha avuto esito positivo.

Quindi per i comandi dipendenti dovresti usare &&

Wring bash, o comandi con comandi indipendenti usano ;

Quindi, se vuoi arrestare il computer, anche il primo job fallito usa ; , ma se vuoi che il successo del primo job avvenga completamente, usa shutdown &&

    
risposta data Web-E 20.08.2013 - 18:50
13

a ; b verrà eseguito b indipendentemente dallo stato di uscita di a. a && b eseguirà b solo se riuscito.

Questo è necessario e sufficiente per rispondere alle prime 3 domande. In particolare, il 2 è troppo ampio e non può avere una risposta definitiva "una": la soluzione migliore è decidere caso per caso.

Per quanto riguarda la quarta domanda: Si tratta della sintassi di Bash .

Non c'è alcun pericolo intrinseco nell'usare entrambi. Ancora una volta, la definizione di cui sopra è sufficiente. Implica che scriverai && quando b ha effetti indesiderati se a non ha successo. Non c'è bisogno di ulteriori regole o spiegazioni, IMHO.

    
risposta data ignis 20.08.2013 - 23:05

Leggi altre domande sui tag