& 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:
example@unixlinux.online:~$ test -x examples.desktop && echo $?
example@unixlinux.online:~$ 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.