Yes, there is a big difference. &&
is short-circuiting, so the subsequent command would be executed only if the previous one returned with an exit code of 0
.
Quoting from the manual:
expression1 &&
expression2
True if both expression1 and expression2 are true.
On the other hand, a script containing
expression1
expression2
would execute the second expression even if the first failed. (Unless you specified the script to exit on error by saying set -e
.)
EDIT: Regarding your comment whether:
command1; command2
is the same as:
command1
command2
The answer is usually. Bash parses an entire statement block before evaluating any of it. A ; doesn't cause the previous command to be evaluated. If the previous command were to have an effect on how the subsequent one would be parsed, then you'd notice the difference.
Consider a file containing aliases, lets call it alias
, with an entry:
alias f="echo foo"
Now consider a script containing:
shopt -s expand_aliases
source ./alias
f
and another one containing:
shopt -s expand_aliases; source ./alias; f
then you might think that both would produce the same output.
The answer is NO. The first one would produce foo
but the second one would report:
... f: command not found
To clarify further, it's not expand_aliases
that's causing the problem. The problem is due to the fact that a statement like:
alias f="echo foo"; f
would be parsed in one go. The shell doesn't really know what f
is, this causes the parser to choke.