关于bash:如何在执行前打印每个命令?

How can I print each command before executing?

本问题已经有最佳答案,请猛点这里访问。

建立一个在执行每个命令之前打印每个命令的bash脚本的最佳方法是什么?

这对于调试很有用。

我已经试过了:

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

应该先打印这个:

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

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


1
set -o xtrace

1
bash -x myscript.sh

这与标准/bin/sh以及iirc一起工作(那时它可能是posix的东西)

记住,这里有bashdb(bash Shell Debugger, release 4.0-0.4)

要恢复正常,请退出子外壳或

1
set +o xtrace


最简单的方法是让bash这样做:

1
set -x

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


set -x很好,但是如果你做了如下的事情:

1
2
3
set -x;
command;
set +x;

它会导致打印

1
2
+ command
+ set +x;

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

1
(set -x; command)

只打印命令。


set -x很好。

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

1
trap 'echo"# $BASH_COMMAND"' DEBUG

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