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

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

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

我已经试过了:

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

它应该先打印这个:

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

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

224655 次浏览
set -o xtrace

bash -x myscript.sh

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

记住,有< >强bashdb < / >强 (bash Shell Debugger, release 4.0-0.4)


若要恢复正常,请退出subshell或

set +o xtrace

最简单的方法是让bash来做:

set -x

或者显式地作为bash -x myscript运行它。

set -x是好的。

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

trap 'echo "# $BASH_COMMAND"' DEBUG

你可以找到很多其他的trap用法。

set -x是可以的,但是如果你这样做:

set -x;
command;
set +x;

这将导致印刷

+ command
+ set +x;

你可以使用子shell来防止这种情况,例如:

(set -x; command)

这只会打印命令。