Bash: run command2 if command1 fails
87,672
Solution 1
These should do what you need:
cmd1 && cmd2 && echo success || echo epic fail
or
if cmd1 && cmd2; then
echo success
else
echo epic fail
fi
Solution 2
The pseudo-code in the question does not correspond to the title of the question.
If anybody needs to actually know how to run command 2 if command 1 fails, this is a simple explanation:
-
cmd1 || cmd2
: This will runcmd1
, and in case of failure it will runcmd2
-
cmd1 && cmd2
: This will runcmd1
, and in case of success it will runcmd2
-
cmd1 ; cmd2
: This will runcmd1
, and then it will runcmd2
, independent of the failure or success of runningcmd1
.
Solution 3
Petr Uzel is spot on but you can also play with the magic $?.
$? holds the exit code from the last command executed, and if you use this you can write your scripts quite flexible.
This questions touches this topic a little bit, Best practice to use $? in bash? .
cmd1
if [ "$?" -eq "0" ]
then
echo "ok"
else
echo "Fail"
fi
Then you also can react to different exit codes and do different things if you like.
Related videos on Youtube
Author by
michelemarcon
Hello, I'm a Java software engineer. I also have some Android and Linux experience.
Updated on September 18, 2022Comments
-
michelemarcon almost 2 years
I want to do something like this:
if cmd1 && cmd2 echo success else echo epic fail fi
How should I do it?
-
Admin about 13 yearsYou're just missing the "then" keyword before the "echo success" command.
-
Admin about 13 yearsHmmm; your pseudocode seems to ask a different question than the one in your title.....
-
Admin about 13 yearsGood resource for some shell scripting exit conditions pixelbeat.org/programming/shell_script_mistakes.html
-
-
mlissner almost 9 yearsThis works, but I'm confused why
||
doesn't look at the output of the firstecho
command. -
m3nda over 8 years@mlissner, the if else expects to exit codes, 0 if the command where launched and 1 if where errors. Do not read at the output.
Just try whoami && whoami && echo success || echo epic fail
and nowwhoami && whoareyou && echo success || echo epic fail
. I cant figure out what you mean by "doesn't look at the output of the first echo command" -
Kazim Zaidi almost 7 years@mlissner I think I got your question, but the answer is that echo command won't fail ever. That is, its return will be 0, i.e. truthy. So the condition that really matters is just
cmd1 && cmd2