Debugging Scripts

Problem

You can’t figure out what’s happening in your script and why it doesn’t work as expected.

Solution

Add set-x to the top of the script when you run it. Or use set-x to turn on xtrace before a troublesome spot and set+x to turn it off after. You may also wish to experiment with the $PS4 prompt (Customizing Your Prompt). xtrace also works on the interactive command line (Customizing Your Prompt). Here’s a script that we suspect is buggy:

#!/usr/bin/env bash
# cookbook filename: buggy
#

set -x

result=$1

[ $result = 1 ] 
  && { echo "Result is 1; excellent." ; exit 0;   } 
  || { echo "Uh-oh, ummm, RUN AWAY! " ; exit 120; }

Now we invoke this script, but first we set and export the value of the PS4 prompt. bash will print out the value of PS4 before each command that it displays during an execution trace (i.e., after a set -x ):

$ export PS4='+xtrace $LINENO:'
$ echo $PS4
+xtrace $LINENO:

$ ./buggy
+xtrace 4: result=
+xtrace 6: '[' = 1 ']'
./buggy: line 6: [: =: unary operator expected
+xtrace 8: echo 'Uh-oh, ummm, RUN AWAY! '
Uh-oh, ummm, RUN AWAY!

$ ./buggy 1
+xtrace 4: result=1
+xtrace 6: '[' 1 = 1 ']'
+xtrace 7: echo 'Result is 1; excellent.'
Result is 1; excellent.

$ ./buggy 2
+xtrace 4: result=2
+xtrace 6: '[' 2 = 1 ']'
+xtrace 8: echo 'Uh-oh, ummm, RUN AWAY! '
Uh-oh, ummm, RUN AWAY!

$ /tmp/jp-test.sh 3
+xtrace 4: result=3
+xtrace 6: '[' 3 = 1 ']'
+xtrace 8: echo 'Uh-oh, ummm, RUN AWAY! '
Uh-oh, ummm, RUN AWAY!

Discussion

It may seem odd to turn something on using - and turn it off using +, but that’s just the way it worked out. Many Unix tools use -n for options or flags, and since you need a way to turn -x off, +x seems natural.

As of bash 3.0 there are a number of new variables to better support debugging: $BASH_ARGC, $BASH_ARGV, $BASH_SOURCE, $BASH_LINENO, $BASH_SUBSHELL, $BASH_ EXECUTION_STRING, and $BASH_COMMAND. This is in addition to existing bash variables like $LINENO and the array variable $FUNCNAME.

Using xtrace is a very handy debugging technique, but it is not the same as having a real debugger. See The Bash Debugger Project (http://bashdb.sourceforge.net/), which contains patched sources to bash that enable better debugging support as well as improved error reporting. In addition, this project contains, in their words, “the most comprehensive source-code debugger for bash that has been written.”

See Also

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.144.124.232