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 ...
Get bash Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.