The job control instruction & in Unix/Linux asks it to run the instruction as a background job, returning you back a shell command prompt.
Executed in a script run in the foreground, this particular instruction will be run as stated above, i.e. in background mode (in a sub-shell, or not if you use source), while the rest of the script continues to run in sequence in foreground mode.
Example with a bash script of 5 instructions, executed in the foreground (call is not followed by &):
#! /bin/bash
ls a*
ls b*
ls c* &
ls d*
ls e*
In that case, the script would call the first ls, wait for its completion, then call the second ls, wait for its completion, call the third ls with &. Here the OS would put that job in background and immediately return control to the script without waiting for completion. The script would thus immediately continue and call the fourth ls, wait for its completion, and finally call the fifth ls.
So for calls / execution, you'd get
- First ls called
- First ls executed
- Second ls called
- Second ls executed
- Third ls called
- Fourth ls called
- Fourth ls executed
- Fifth ls called
- Fifth ls executed
As for the Third ls, it would finish executing any time after step 5, in effect interspersing its results in between the ones of the fourth or fifth ls calls.
Using source would not change that behaviour, only execute the script in the current shell (using source), or execute the script in a sub-shell (not using source).
waitcommand.