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_IF
nella grammatica della shell posix , che fa parte di un and_or
elenco di comandi, che include anche il ||
quale è un OR_IF
con 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_IF
s ( &&
) e / o OR_IF
s ( ||
) può essere messo insieme (come and_or
definito 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-OR
elenco è 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 foo
che non funziona (ad es. cortocircuito echo foo
). Quindi echo bar
viene eseguito il comando .
Nel secondo caso, true esce con un codice di 0
$ true
$ echo $?
0
e quindi echo foo
non viene eseguito, quindi echo bar
viene eseguito.
false && echo "Will not be printed"
.