Swiftorial Logo
Home
Swift Lessons
Tutorials
Learn More
Career
Resources

Debugging in Shell Scripting

This tutorial provides a comprehensive guide to debugging shell scripts, helping you identify and fix errors effectively.

1. Using set -x for Debugging

The set -x command enables a mode of the shell where all executed commands are printed to the terminal. This is useful for tracing the execution of your script.

To enable debugging mode, use:

set -x

To disable debugging mode, use:

set +x

Here's an example:

#!/bin/bash

set -x
echo "Debugging mode is on"
ls /nonexistent-directory
set +x
echo "Debugging mode is off"

2. Using set -e to Exit on Errors

The set -e command makes the script exit immediately if any command exits with a non-zero status. This helps in identifying the command causing the failure.

#!/bin/bash

set -e
echo "This will be executed"
ls /nonexistent-directory
echo "This will not be executed"

In this example, the script will exit after the ls command fails, and the final echo command will not be executed.

3. Using Trap for Debugging

The trap command can be used to execute commands when the script exits or receives a signal. This is useful for logging and cleanup.

3.1. Basic Usage of trap

Here's an example of using trap to print a message when the script exits:

#!/bin/bash

trap 'echo "An error occurred. Exiting..."' EXIT

echo "This is a test script"
ls /nonexistent-directory
echo "This will not be printed"

When the script exits due to the error, the trap command will execute and print the message.

3.2. Using trap for Logging

You can also use trap to log the line number where the error occurred:

#!/bin/bash

trap 'echo "Error on line $LINENO"' ERR

echo "This is a test script"
ls /nonexistent-directory
echo "This will not be printed"

4. Using Echo Statements for Debugging

Inserting echo statements in your script can help you understand its flow and the values of variables at different points.

#!/bin/bash

echo "Starting script..."
var1="Hello"
echo "var1 is $var1"
var2="World"
echo "var2 is $var2"
echo "$var1 $var2"
echo "Script finished."

5. Redirecting Debug Output

You can redirect the debug output to a file for easier analysis:

#!/bin/bash

exec 2>debug.log
set -x

echo "This is a test script"
ls /nonexistent-directory

In this example, all debug output will be written to debug.log.

6. Conclusion

In this tutorial, you learned various techniques for debugging shell scripts, including using set -x, set -e, trap, echo statements, and redirecting debug output. Effective debugging helps you identify and fix errors, making your scripts more robust and reliable.