Trap Shell-Script Errors
December 2nd, 2007 by LJ Staff
An easy way to protect shell scripts from creating havoc when they go wrong due to a missing directory is to replace the shell's cd command by a function declared at the start of the script:
cd(){
if ! builtin cd $1
then echo "Failed to cd $1 !!!" >&2
exit 1
fi
}
No other changes are needed in the script. An alternative option is to add
set -e
...at the start of a script, then any failing command (outside a construct that tests the return code like if ...) will cause the script to stop. It also encourages you to make sure any other scripts that you call will exit with an appropriate return code: 0 for ok, and anything else for failure.
This Tech Tip was brought to us by Mark in France. Thanks, Mark!
Instant fame is easy at Linux Journal. Just send us your useful Tech Tips to share with the Linux Community, and we'll send you a cool t-shirt for your efforts!
Please note: Tech Tips featured in this specific section of LinuxJournal.com are kindly brought to us by readers and are not necessarily tested by LinuxJournal.com editors.
Subscribe now!
The Latest
Newsletter
Tech Tip Videos
- Jul-01-09
- Jun-29-09
Recently Popular
From the Magazine
July 2009, #183
News Flash: Linux Kernel 3.0 to include an on-the-go Expresso machine interface! Ok, maybe not, but Linux is definitely going mobile, from phones to e-readers. Find out more inside about Android, the Kindle 2, the Western Digital MyBook II, The Bug, and Indamixx (a portable recording studio). And if you've gone mobile and you been wanting more Emacs in your life then check out Conkeror.
To compliment the mobile we've got the stationary: parsing command line options with getopt, checking your Ruby code with metric_fu, and building a secure Squid proxy. How is this stationary you ask? What can we say? It's not. We just wanted to see if anybody actually read this part of the page :) .
All this and more, and all you have to do is get your hot sweaty hands on the latest copy of Linux Journal.
Delicious
Digg
StumbleUpon
Reddit
Facebook








What does "builtin" in the
On December 26th, 2007 Anonymous (not verified) says:
What does "builtin" in the script do?
Thanks
Another BIG help is 'set
On December 6th, 2007 Anonymous (not verified) says:
Another BIG help is 'set -u', which treats unset variables as an error. I trashed my system once using rsync: i misspelled a variable name, it expanded to nothing, the trailing / caused it to select the root directory as the destination, and the --delete flag promptly deleted everything on my filesystem. :-(
These are the first non-comment lines in all of my shell scripts now:
set -e
set -u
:-)
Disclaimer
On December 6th, 2007 Shawn Powers says:
So your disclaimer is for my file cleanup script, isn't it?
"rm -rf /"
Here's the real tip: Don't listen to Shawn. :)
And now for my disclaimer. If you're new to Linux, I was joking. rm -rf is NOT your friend. It will kick your dog, steal your significant other, and call you ugly. Oh, and delete all your files.
Slight tweak
On December 3rd, 2007 Andrew Kirkpatrick (not verified) says:
If you use "$@" instead of $1, it will work with directory names containing whitespace, as well as handle multiple arguments such as cd -P /path/with/symlink
cd(){
if ! builtin cd "$@"
then echo "Failed to cd $@ !!!" >&2
exit 1
fi
}
Cheers
How is this any better
On November 30th, 2007 Anonymous (not verified) says:
How is this any better than:
if cd some-place
then
ok
else
fail
fi
Multiple uses
On November 30th, 2007 Phil Hughes says:
If you script only has one cd in it, it isn't. But, by defining the function at the start of the script you can protect all cd commands within the script.
In a correctly written
On December 5th, 2007 CoolHand says:
In a correctly written script, one should be checking the existance and permissions of a directory before trying to change to it - and, if necessary, creating the directory if it doesn't.
Where do these kids learn to program
On December 10th, 2007 Anonymous (not verified) says:
Thank you.
Post new comment