100

For example, I have a simple bash file

#!/bin/bash
cd ~/hello
ls

How can I make it display every command before executing it? Just the opposite effect of "@echo off" in windows batch scripting.

2
  • 1
    For those looking for what the set options are, you can find them on this man page.
    – mkobit
    Oct 16, 2015 at 16:41
  • You can simply extend shebang like this #!/bin/bash -x
    – sobi3ch
    Mar 22, 2016 at 10:48

8 Answers 8

127
bash -x script

or

set -x

in the script.

You can unset the option again with set +x. If you just want to do it for a few commands you can use a subshell: `(set -x; command1; command; ...;)

2
  • I have always used this to great effect. The output looks a little dirtier than you might first expect.
    – Scott Pack
    May 31, 2009 at 13:51
  • 3
    By setting PS4 you can tweak the prompt of -x. E.g.: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script (date will slow it down, though) Nov 17, 2014 at 11:15
25

These also work:

set -v

or

#!/bin/bash -v

But -v doesn't print the PS4 string before each script line and it doesn't trace the steps of a "for" statement (for example) individually. It does echo comments while -x doesn't.

Here's an example of the output using -v:

#!/bin/bash -v
# this is a comment
for i in {1..4}
do
    echo -n $i
done
1234echo

echo hello
hello

Here's the result of the same script with -x:

+ for i in '{1..4}'
+ echo -n 1
1+ for i in '{1..4}'
+ echo -n 2
2+ for i in '{1..4}'
+ echo -n 3
3+ for i in '{1..4}'
+ echo -n 4
4+ echo

+ echo hello
hello

Note that I included "echo -n" to add emphasis to the differences between -v and -x. Also, -v is the same as "-o verbose", but the latter seems not to work as part of a shebang.

2
  • Great explanation! without doing any research, it looks to me like Verbose and eXplicit are what those two letters stand for.
    – Ape-inago
    May 31, 2009 at 15:58
  • I think -x is closer to eXecute. Aug 25, 2012 at 15:08
10

This should also work:

#!/bin/bash -x
cd ~/hello
ls
7

This should work:

set -o verbose #echo on
...
set +o verbose #echo off
5

set -o xtrace and set +o xtrace are your friends (it is more verbose, than -o verbose, and the output goes to STDERR, as opposed to verbose, which seems to log to STDOUT).

See more tips here

4

There are a few ways.

#!/usr/bin/env bash -x

as the shebang line.

Including set -x in the script itself will enable the functionality while set +x will disable it. Both of these methods will also work with the more portable sh shell.

If I remember correctly perl also has the -x option.

1

goes like

language -x script

language = python, perl, bash -x = operator script = filename

hope it helps.

1
  • 3
    -x has nothing to with echoing in Python May 26, 2015 at 14:50
0

#! /bin/bash -x does what you want.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.