riga di comando - qual è lo scopo di &&?
In guscio, quando vedi
$ command one && command two
l'intento è quello di eseguire il comando che segue il &&solo se il primo comando ha esito positivo. Questo è idiomatico delle conchiglie Posix e non si trova solo in Bash.
Intende impedire l'esecuzione del secondo processo se il primo fallisce.
Potresti notare che ho usato la parola "intento" - questo è per una buona ragione. Non tutti i programmi hanno lo stesso comportamento, quindi per farlo funzionare, è necessario capire cosa considera un "errore" e come lo gestisce leggendo la documentazione e, se necessario, il codice sorgente.
La tua shell considera un valore di ritorno di 0 per vero, altri numeri positivi per falso
I programmi restituiscono un segnale all'uscita. Dovrebbero restituire 0 se escono correttamente o maggiori di zero in caso contrario. Ciò consente una quantità limitata di comunicazione tra i processi.
Si &&fa riferimento a come AND_IFnella grammatica della shell posix , che fa parte di un and_orelenco di comandi, che include anche il ||quale è un OR_IFcon una semantica simile.
Simboli grammaticali, citati dalla documentazione:
%token AND_IF OR_IF DSEMI
/* '&&' '||' ';;' */
E la grammatica (citata anche dalla documentazione), che mostra che qualsiasi numero di AND_IFs ( &&) e / o OR_IFs ( ||) può essere messo insieme (come and_ordefinito in modo ricorsivo):
and_or : pipeline
| and_or AND_IF linebreak pipeline
| and_or OR_IF linebreak pipeline
Entrambi gli operatori hanno la stessa precedenza e sono valutati da sinistra a destra (sono associativi di sinistra). Come dicono i documenti:
Un AND-ORelenco è una sequenza di una o più condotte separate dagli operatori "&&"e "||".
Una lista è una sequenza di uno o più E-OR elenchi separati dagli operatori ';'e '&'facoltativamente interrotto da ';', '&'o.
Gli operatori "&&"e "||"devono avere la stessa precedenza e devono essere valutati con associatività di sinistra. Ad esempio, entrambi i seguenti comandi scrivono solo la barra nell'output standard:
$ false && echo foo || echo bar
$ true || echo foo && echo bar
Nel primo caso, il falso è un comando che esce con lo stato di 1
$ false
$ echo $?
1
il che significa echo fooche non funziona (ad es. cortocircuito echo foo). Quindi echo barviene eseguito il comando .
Nel secondo caso, true esce con un codice di 0
$ true
$ echo $?
0
e quindi echo foonon viene eseguito, quindi echo barviene eseguito.
false && echo "Will not be printed".