bash -x
and set -x
The bash -x
and set -x
are both used to enable debugging in a Bash script. The primary difference between the two is when they are used.
bash -x
commandbash -x
is used when running a script — it turns on debugging for the entire script. For example, if you have a script called my_script.sh
, you would run it with bash -x my_script.sh
to enable debugging for the entire script. Here are a few examples of how bash -x
can be used in a Bash script:
Debugging an entire script:
#!/bin/bash
name="John Doe"
echo "Hello, $name"
To run this script with debugging in the below terminal, we would run it with bash -x script.sh
.
When this script runs, it will display the following output:
+ name='John Doe'
+ echo 'Hello, John Doe'
Hello, John Doe
Debugging an entire script with a function:
#!/bin/bash
my_function() {
echo "Inside my_function"
}
my_function
To run this script with debugging in the terminal below, we would run it with bash -x script.sh
.
When this script runs, it will display the following output:
+ my_function
+ echo 'Inside my_function'
Inside my_function
Debugging an entire script with a loop:
#!/bin/bash
for i in {1..5}; do
echo $i
done
To run this script with debugging in the terminal, we would run it with bash -x script.sh
.
When this script runs, it will display the following output:
+ echo 1
1
+ for i in {1..5}
+ echo 2
2
+ for i in {1..5}
+ echo 3
3
+ for i in {1..5}
+ echo 4
4
+ for i in {1..5}
+ echo 5
5
set -x
commandset -x
is used within a script – it turns on debugging for the current shell session. For example, if you have a script called my_script.sh
that contains the following line:
set -x
When the script runs, debugging will be enabled for the current shell session, and any commands executed after the set -x
line will be displayed with their expanded values. Examples of set -x
in bash are below:
Debugging a variable assignment:
#!/bin/bash
set -x
name="John Doe"
echo "Hello, $name"
set +x
We run the above code in the terminal below by creating an executable my_script.sh
file.
When this script runs, it will display the following output:
+ name='John Doe'
+ echo 'Hello, John Doe'
Hello, John Doe
Debugging a function:
#!/bin/bash
set -x
my_function() {
echo "Inside my_function"
}
my_function
set +x
We run the above code in the terminal below by creating an executable my_script.sh
file.
When this script runs, it will display the following output:
+ my_function
+ echo 'Inside my_function'
Inside my_function
Debugging a loop:
#!/bin/bash
set -x
for i in {1..5}; do
echo $i
done
set +x
We run the above code in the terminal below by creating an executable my_script.sh
file.
When this script runs, it will display the following output:
+ for i in {1..5}
+ echo 1
1
+ for i in {1..5}
+ echo 2
2
+ for i in {1..5}
+ echo 3
3
+ for i in {1..5}
+ echo 4
4
+ for i in {1..5}
+ echo 5
5
In summary, bash -x
is used to enable debugging for an entire script when it's run, whereas set -x
is used to enable debugging for the current shell session within a script.