Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

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.

share|improve this question
add comment

8 Answers 8

up vote 47 down vote accepted
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; ...;)

share|improve this answer
    
I have always used this to great effect. The output looks a little dirtier than you might first expect. –  Scott Pack May 31 '09 at 13:51
add comment

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.

share|improve this answer
    
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 '09 at 15:58
    
I think -x is closer to eXecute. –  Steven Parkes Aug 25 '12 at 15:08
add comment

This should also work:

#!/bin/bash -x
cd ~/hello
ls
share|improve this answer
add comment

This should work:

set -o verbose #echo on
...
set +o verbose #echo off
share|improve this answer
add comment

goes like

language -x script

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

hope it helps.

share|improve this answer
add comment

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.

share|improve this answer
add comment

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

share|improve this answer
add comment

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

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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