Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

In bash, I sometimes want to run several commands in serial and don't want to wait for them to finish before I type the new ones. So I do something like this:

cmd1; cmd2; cmd3

Unfortunately, one of the commands might fail. In that case, I'd like to stop. Is there an easy way to do this, but make it so that I only keep running the commands if the previous command had a 0 exit code?

share|improve this question
up vote 33 down vote accepted

Use && operator,

cmd1 && cmd2 && cmd3

In shellscripting, && and || operators are modelled after optimized implementation of logical operators in C. && means AND operator, and || means OR. Unix is tightly related to C, and in C, the second operand of logical operators isn't evaluated if the result is already known from the first operand. E.g. "false && x" is false for any x, so there is no need to evaluate x (especially if x is some complex boolean expression); similarly for "true || x". This is also called short-circuiting semantics.

And in Unix, it is traditional to interpret commands' return values as "successful completion" truth values: exit code 0 means true (success), nonzero means false (failure). So, when the first command in cmd1 && cmd2 returns "false" (nonzero exit status, which indicates failure), the compound command's status is known: failure. So overall interpretation of cmd1 && cmd2 may be: "execute cmd1, AND THEN, if it didn't fail, cmd2". Which is what you basically want in your question.

Similarly with OR: cmd1 || cmd2 can be interpreted as "execute cmd1, OR IF it fails, cmd2".

share|improve this answer
+1 for explaining || – Alp Jun 23 '13 at 13:47

"Chaining Commands an grouping them"

ping || { echo "ping not successful"; exit 1; }

pings, only if not successful, executes the chained group of commands in brackets.


The list has to be terminated with a ";".

There must be blank spaces between brackets and the grouped commands!

share|improve this answer

Simply with the && operator. For instance:

cmd1 && cmd2 && cmd3

If one of the commands fails (returns an exit value other than 0), the other commands won't run.

share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .