Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ignoring specific errors in a shell script

I have a small snippet of a shell script which has the potential to throw many errors. I have the script currently set to globally stop on all errors. However i would like for this small sub-section is slightly different.

Here is the snippet:

recover database using backup controlfile until cancel || true;  auto 

I'm expecting this to eventually throw a "file not found" error. However i would like to continue executing on this error. For any other error i would like the script to stop.

What would be the best method of achieving this?

Bash Version 3.00.16

like image 262
Stunt Avatar asked Jul 24 '13 09:07

Stunt


People also ask

How do I ignore standard error?

You can ignore standard error on screen when you write stderr to /dev/null .

How do I supress an error in Unix?

To suppress error output in bash , append 2>/dev/null to the end of your command. This redirects filehandle 2 (STDERR) to /dev/null .


1 Answers

In order to cause bash to ignore errors for specific commands you can say:

some-arbitrary-command || true 

This would make the script continue. For example, if you have the following script:

$ cat foo set -e echo 1 some-arbitrary-command || true echo 2 

Executing it would return:

$ bash foo 1 z: line 3: some-arbitrary-command: command not found 2 

In the absence of || true in the command line, it'd have produced:

$ bash foo 1 z: line 3: some-arbitrary-command: command not found 

Quote from the manual:

The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command’s return status is being inverted with !. A trap on ERR, if set, is executed before the shell exits.

EDIT: In order to change the behaviour such that in the execution should continue only if executing some-arbitrary-command returned file not found as part of the error, you can say:

[[ $(some-arbitrary-command 2>&1) =~ "file not found" ]] 

As an example, execute the following (no file named MissingFile.txt exists):

$ cat foo  #!/bin/bash set -u set -e foo() {   rm MissingFile.txt } echo 1 [[ $(foo 2>&1) =~ "No such file" ]] echo 2 $(foo) echo 3 

This produces the following output:

$ bash foo  1 2 rm: cannot remove `MissingFile.txt': No such file or directory 

Note that echo 2 was executed but echo 3 wasn't.

like image 160
devnull Avatar answered Sep 30 '22 11:09

devnull