'&&' vs. '&' with the 'test' command in Bash
&
executes a command in the background, and will return 0 regardless of its status.
From the man page:
If a command is terminated by the control operator &, the shell executes the command in the background in a subshell. The shell does not wait for the command to finish, and the return status is 0. Commands separated by a ; are executed sequentially; the shell waits for each command to terminate in turn. The return status is the exit status of the last command executed.
Look at what your commands are:
test -x examples.desktop && echo $?
This means check to see if examples.desktop
is executable and if it is then execute echo $?
.
test -x examples.desktop & echo $?
means check to see if examples.desktop
is executable in the "background". Then execute echo $?
.
The meaning of &&
and &
are intrinsically different.
- What is
&&
in Bash? In Bash—and many other programming languages—&&
means “AND”. And in command execution context like this, it means items to the left as well as right of&&
should be run in sequence in this case. - What is
&
in Bash? And a single&
means that the preceding commands—to the immediate left of the&
—should simply be run in the background.
So looking at your example:
gndlp@ubuntu:~$ test -x examples.desktop && echo $?
gndlp@ubuntu:~$ test -x examples.desktop & echo $?
[1] 2992
0
The first command—as it is structured—actually does not return anything. But second command returns a [1] 2992
in which the 2992
refers to the process ID (PID) that is running in the background and the 0
is the output of the first command.
Since the second command is just running test -x examples.desktop
in the background it happens quite quickly, so the process ID is spawned and gone pretty immediately.