&
esegue un comando in background e restituirà 0 indipendentemente dal suo stato.
Dalla pagina man:
Se un comando viene terminato dall'operatore di controllo &, la shell esegue il comando in background in una subshell. La shell non attende la fine del comando e lo stato di ritorno è 0. Comandi separati da un; vengono eseguiti in sequenza; la shell attende che ogni comando termini a turno. Lo stato di ritorno è lo stato di uscita dell'ultimo comando eseguito.
Guarda quali sono i tuoi comandi:
test -x examples.desktop && echo $?
Questo significa controllare se examples.desktop
è eseguibile e se lo è esegui echo $?
.
test -x examples.desktop & echo $?
significa controllare se examples.desktop
è eseguibile in "background". Quindi esegui echo $?
.
Il significato di &&
e &
sono intrinsecamente diversi.
- Che cos'è
&&
in Bash? In Bash—e in molti altri linguaggi di programmazione—&&
significa "E". E in un contesto di esecuzione del comando come questo, significa elementi sia a sinistra che a destra di&&
dovrebbe essere eseguito in sequenza in questo caso. - Che cos'è
&
in Bash? E un singolo&
significa che i comandi precedenti—all'immediata sinistra del&
—dovrebbe semplicemente essere eseguito in background.
Quindi, guardando il tuo esempio:
[email protected]:~$ test -x examples.desktop && echo $?
[email protected]:~$ test -x examples.desktop & echo $?
[1] 2992
0
Il primo comando, così come è strutturato, in realtà non restituisce nulla. Ma il secondo comando restituisce un [1] 2992
in cui 2992
si riferisce all'ID processo (PID) in esecuzione in background e al 0
è l'output del primo comando.
Poiché il secondo comando esegue solo test -x examples.desktop
in background avviene abbastanza rapidamente, quindi l'ID del processo viene generato e scompare immediatamente.