Reputation: 18777
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
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
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
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