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
Quoting from the manual:
True if both expression1 and expression2 are true.
On the other hand, a script containing
would execute the second expression even if the first failed. (Unless you specified the script to exit on error by saying
EDIT: Regarding your comment whether:
is the same as:
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
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.