&
ejecuta un comando en segundo plano y devolverá 0 independientemente de su estado.
Desde la página del manual:
Si un comando es terminado por el operador de control &, el shell ejecuta el comando en segundo plano en un subshell. El shell no espera a que finalice el comando y el estado de retorno es 0. Comandos separados por un; se ejecutan secuencialmente; el shell espera a que cada comando termine a su vez. El estado de retorno es el estado de salida del último comando ejecutado.
Mira cuáles son tus comandos:
test -x examples.desktop && echo $?
Esto significa verificar si examples.desktop
es ejecutable y si lo es, ejecute echo $?
.
test -x examples.desktop & echo $?
significa verificar si examples.desktop
es ejecutable en el "fondo". Luego ejecuta echo $?
.
El significado de &&
y &
son intrínsecamente diferentes.
- ¿Qué es
&&
? en Bash? En Bash, y muchos otros lenguajes de programación,&&
significa “Y”. Y en un contexto de ejecución de comandos como este, significa elementos tanto a la izquierda como a la derecha de&&
debe ejecutarse en secuencia en este caso. - ¿Qué es
&
? en Bash? Y un solo&
significa que los comandos anteriores, inmediatamente a la izquierda del&
—simplemente debe ejecutarse en segundo plano.
Así que mirando tu ejemplo:
[email protected]:~$ test -x examples.desktop && echo $?
[email protected]:~$ test -x examples.desktop & echo $?
[1] 2992
0
El primer comando, tal como está estructurado, en realidad no devuelve nada. Pero el segundo comando devuelve un [1] 2992
en el que el 2992
hace referencia al ID del proceso (PID) que se ejecuta en segundo plano y al 0
es la salida del primer comando.
Dado que el segundo comando solo ejecuta test -x examples.desktop
en segundo plano, sucede con bastante rapidez, por lo que la ID del proceso se genera y desaparece de inmediato.