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!
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.”
help set
man bash
Chapter 9 in Cameron Newham’s Learning the bash Shell (O’Reilly), which includes a shell script for debugging other shell scripts
3.144.124.232