如何在执行前打印每个命令?

时间:2011-04-21 22:27:24

标签: bash

设置在执行命令之前打印每个命令的Bash脚本的最佳方法是什么?

这对于调试来说非常有用。

我已经尝试过了:

CMD="./my-command --params >stdout.txt 2>stderr.txt"
echo $CMD
`$CMD`

应该首先打印出来:

./my-command --params >stdout.txt 2>stderr.txt

然后执行./my-command --params,输出重定向到指定的文件。

4 个答案:

答案 0 :(得分:252)

set -o xtrace

bash -x myscript.sh

这适用于标准/ bin / sh以及IIRC(它可能是POSIX的东西)

请记住,bashdbbash Shell Debugger, release 4.0-0.4


要恢复正常,请退出子shell或

set +o xtrace

答案 1 :(得分:71)

最简单的方法是让bash执行此操作:

set -x

或者以bash -x myscript显式运行。

答案 2 :(得分:50)

set -x很好,但是如果你做的话:

set -x;
command;
set +x;

会导致打印

+ command
+ set +x;

您可以使用子shell来阻止,例如:

(set -x; command)

只会打印命令。

答案 3 :(得分:24)

set -x没问题。

打印每个已执行命令的另一种方法是将trapDEBUG一起使用。 将此行放在脚本的开头:

trap 'echo "# $BASH_COMMAND"' DEBUG

您可以找到许多其他trap用法here