What is the difference between
echo "Hello " ; echo "world"
and
echo "Hello " && echo "world"
Both seems to run the two commands after each other.
What is the difference between
echo "Hello " ; echo "world"
and
echo "Hello " && echo "world"
Both seems to run the two commands after each other.
echo "Hello " ; echo "world"
means run echo "world"
no matter what the exit status of the previous command echo "Hello"
is i.e. echo "world"
will run irrespective of success or failure of the command echo "Hello"
.
Whereas in case of echo "Hello " && echo "world"
, echo "world"
will only run if the first command (echo "Hello"
) is a success (i.e. exit status 0).
The following commands give an example of how the shell handles commands chaining using the different operators:
$ false ; echo "OK"
OK
$ true ; echo "OK"
OK
$ false && echo "OK"
$ true && echo "OK"
OK
$ false || echo "OK"
OK
$ true || echo "OK"
$
test && echo success || echo fail
.
– orion
Feb 28 '15 at 14:20
&&
is multiplication and ||
is addition and helps to keep operation precedence straight. eg true && false || true
is 1 * 0 + 1
and any resultant positive number is truthy; 0
is falsey
– neaumusic
Oct 19 '20 at 23:56
false
and true
are commands that always fail or always succeed, respectively. &&
and ||
execution is based on exit status, not on boolean value, but it is quite analogous to “and” and “or” in other programming languages. Note that operator precedence is also different to most programming languages: true || echo 2 && echo 1
is not grouped as true or (print 2 and print 1)
, as (only) 1
is printed. In shell, it’s evaluated left to right instead.
– Sebastian Simon
Jan 9 at 17:03
Every command in Linux returns an exit code when it finishes running. The exit code is assigned to a special variable ?
, so you can easily check the status of last command, e.g. by echo $?
. This is often utilised in scripts. If the command finishes successfully, it returns an exit code 0, whereas if there are any errors during the execution, the exit status is non-zero. See example below:
$ echo "Hello" Hello $ echo $? 0 $ rm nonexistent-file rm: cannot remove ‘nonexistent-file’: No such file or directory $ echo $? 1
Now, this leads us to your question. The &&
is a special operator that says 'execute the next command only if the previous command was successful, i.e. returned with an exit code of zero'. There is also a reverse operator ||
, which only executes the following command if the previous command failed, i.e. exited with non-zero. See example below:
$ echo "Hello" && echo "Previous command was successful" Hello Previous command was successful $ rm nonexistent-file && echo "This will not be printed" rm: cannot remove ‘nonexistent-file’: No such file or directory $ rm nonexistent-file || echo "But this will be shown" rm: cannot remove ‘nonexistent-file’: No such file or directory But this will be shown
EDIT: The qustion was about the difference betweem &&
and ;
so for this to be a full answer I need to add that a semicolon simply divides one command from another. No checking of the exit code takes place, so if you have several commands separated by semicolons, they are simply executed sequentially, i.e. one after another, completely independently from each other.
In addition to @heemayl's answer, &&
(and also ||
) will result in the shell only handling a single exit code for all the chained commands. So if you have a trap [...] ERR
or set -o errexit
line it will process all the commands before doing the exit code handling.
&&
),echo "world"
is only executed if and only ifecho "Hello "
returns an exit status of zero. – jasonwryan Feb 27 '15 at 8:00test -f /etc/passwdx && echo hello
versustest -f /etc/passwdx ; echo hello
(you may substitute any file you want, existing or non-existing). – user Feb 27 '15 at 10:46