
Raju asks:
How can I Debug a shell scripts?
This is most common question asked by new admins or UNIX user.
Shell scripting debugging can be boring job (read as not easy). There are various ways to debug a shell script.
-x option to debug a shell script
Run a shell script with -x option.
$ bash -x script-name
$ bash -x domains.sh
Use of set builtin command
Bash shell offers debugging options which can be turn on or off using set command.
=> set -x : Display commands and their arguments as they are executed.
=> set -v : Display shell input lines as they are read.
You can use above two command in shell script itself:
#!/bin/bash clear # turn on debug mode set -x for f in * do file $f done # turn OFF debug mode set +x ls # more commands
You can replace standard
#!/bin/bash
with (for debugging)
#!/bin/bash -xv
Use of intelligent DEBUG function
Add special variable _DEBUG. Set to `on' when you need to debug a script:
_DEBUG="on"
Put the following function at the beginning of the script:
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@ || :
}
Now wherever you need debugging simply use DEBUG function
DEBUG echo "File is $filename"
OR
DEBUG set -x
Cmd1
Cmd2
DEBUG set +x
When debugging done and before moving a script to production set _DEBUG to off
No need to delete debug lines.
_DEBUG="off" # set to anything but not to 'on'
Sample script:
#!/bin/bash
_DEBUG="on"
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@ || :
}
DEBUG echo 'Reading files'
for i in *
do
grep 'something' $i > /dev/null
[ $? -eq 0 ] && echo "Found in $i file" || :
done
DEBUG set -x
a=2
b=3
c=$(( $a + $b ))
DEBUG set +x
echo "$a + $b = $c"
Save and run the script:
$ ./script.sh
Output:
Reading files Found in xyz.txt file + a=2 + b=3 + c=5 + DEBUG set +x + '[' on == on ']' + set +x 2 + 3 = 5
Now set DEBUG to off
_DEBUG="off"
Run script:
$ ./script.sh
Output:
Found in xyz.txt file 2 + 3 = 5
Above is a simple but quite effective technique. You can also try to use DEBUG as an alias instead of function.
See also:
Featured Articles:
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- 10 Greatest Open Source Software Of 2009
- My 10 UNIX Command Line Mistakes
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- Top 20 OpenSSH Server Best Security Practices
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Linux Video Editor Software
- Email this to a friend
- Download PDF version
- Printable version
- Comment RSS feed
- Last Updated: Sep/24/2007


{ 9 comments… read them below or add one }
For running under “set -x” or “set +x”, why not just run it as:
bash -x ./script.sh
Also, instead of having _DEBUG in your script, just export it from your shell:
$ export _DEBUG=on
Now, you have to make absolutely no changes to enable or disable all debugging.
_ranger_,
Good idea however you may have to modify script little to check if _DEBUG is defined or not.
Appreciate your post.
I liked this debug method and implemented it in a simple script I wrote :) It really does make for much cleaner code than what I have been doing before. Thanks mate
thanks,it is good idea
It’s a good idea. Thanks!
http://bashdb.sourceforge.net/
very nice, thanx
[ "$_DEBUG" == "on" ] && $@ || :
Why are you using last || operator?
Yes, it is not required.