79

Consider:

gndlp@ubuntu:~$ test -x examples.desktop  && echo $?
gndlp@ubuntu:~$ test -x examples.desktop  & echo $?
[1] 2992
0

Why is Bash acting the way it is in this situation?

Is the test command simply not finishing and thus the echo command isn't processed?

1
  • 6
    You don't explain the behavior you expect. What about this is surprising? Why is it surprising? What expectation does it contradict? Commented Nov 6, 2014 at 3:58

3 Answers 3

157

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.

0
22

& 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.

10

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 $?.

Not the answer you're looking for? Browse other questions tagged or ask your own question.