Sachin
Sachin

Reputation: 18777

How to avoid a bash script from failing when -e option is set?

I have a bash script with -e option set, which fails the whole script on the very first error.

In the script, I am trying to do an ls on a directory. But that path may or may not exist. If the path does not exist, the ls command fails, since the -e flag is set.

Is there a way by which I can prevent the script from failing?

As a side note, I have tried the trick to do an set +e and set -e before and after that command and it works. But I am looking for some better solution.

Upvotes: 42

Views: 16831

Answers (3)

chepner
chepner

Reputation: 532333

You can "catch" the error using || and a command guaranteed to exit with 0 status:

ls $PATH || echo "$PATH does not exist"

Since the compound command succeeds whether or not $PATH exists, set -e is not triggered and your script will not exit.

To suppress the error silently, you can use the true command:

ls $PATH || true

To execute multiple commands, you can use one of the compound commands:

ls $PATH || { command1; command2; }

or

ls $PATH || ( command1; command2 )

Just be sure nothing fails inside either compound command, either. One benefit of the second example is that you can turn off immediate-exit mode inside the subshell without affecting its status in the current shell:

ls $PATH || ( set +e; do-something-that-might-fail )

Upvotes: 59

procleaf
procleaf

Reputation: 738

Another option is to use trap to catch the EXIT signal:

trap 'echo "ls failed" ; some_rescue_action' EXIT
ls /non_exist

Upvotes: 5

Majid Laissi
Majid Laissi

Reputation: 19788

one solution would be testing the existence of the folder

function myLs() {
    LIST=""
    folder=$1
    [ "x$folder" = "x" ] && folder="."
    [ -d $folder ] && LIST=`ls $folder`
    echo $LIST
}

This way bash won't fail if $folder does not exist

Upvotes: 3

Related Questions