Am I correct to assume that when
; joins two commands on a line, Bash always waits until the first command has exited before executing the second command?
And similarly, in a shell script containing two different commands on different lines, Bash always waits until the command on the first line has exited before executing the command on the second line?
If this is the case, is there a way to execute two commands in one line or in a script, so that the second command doesn’t wait until the first command has finished?
Also, are different lines in a shell script equivalent to separate lines joined by
You’re correct, commands in scripts are executed sequentially by default.
You can run a command in the background by suffixing it with
& (a single ampersand).
Commands on separate lines are equivalent to commands joined with
; by default. If you tell your shell to abort on non-zero exit codes (
set -e), then the script will execute as though all the commands were joined with
To answer your second question, you can use
& to launch a command in the background and continue with the script without waiting for it to finish.
commandA & commandB
If you run this at an interactive terminal (instead of a script), you can use
fg to bring the backgrounded command back into focus, or
jobs to see a list of background tasks.
In the simplest scenario, when you have full control over the previous process you can chain the next command with
firstCommand && secondCommand as already mentioned in other answers. The syntaxis implies that
firstCommand assumes responsibility for returning a correct exit code (
0 on success and non-zero on failure), and that
secondCommand will only run if
firstCommand exited successfully.
When you do not have control over
firstCommand or when it’s already running, or when
firstCommand does not return sane exit codes on success/failure then you can poll for running processes every N seconds and start
secondCommand after the first one exits:
while true ; do pgrep firstCommand && echo 'Still running...' || secondCommand ; sleep 1 ; done
secondCommandwill run even if
firstCommandfinished with a non-zero exit status.
As others said, you have to add & sign at the end of command that should run in background.
If you want a script to complete all tasks simultaneously and then exit, just add "wait" command at the end of the script. In such scenario, bash is waiting for all commands to finish until it goes any further.