Shell – the difference between the use of ; and executing a script

command lineshell

I'm using bash as my main shell, but it's an open question and responses for shells others than bash are very welcome.

If I'm typing interactively

#original line 
#wget http://something.com && unzip something && mv -f something /home/poney/ 
#new line
wget http://something.com ; unzip something ; mv -f something /home/poney/

Does it make any difference in term of execution pile, order, memory, interpretation, permission compare to a script that contains those line:

#!/bin/bash
wget http://something.com
unzip something 
mv -f something /home/poney/

PS:

except the fact that executing a script is shorter than typing 3 command in a row obviously.

Best Answer

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.

Related Question