设置在执行命令之前打印每个命令的Bash脚本的最佳方法是什么?
这对于调试来说非常有用。
我已经尝试过了:
CMD="./my-command --params >stdout.txt 2>stderr.txt"
echo $CMD
`$CMD`
应该首先打印出来:
./my-command --params >stdout.txt 2>stderr.txt
然后执行./my-command --params
,输出重定向到指定的文件。
答案 0 :(得分:252)
set -o xtrace
或
bash -x myscript.sh
这适用于标准/ bin / sh以及IIRC(它可能是POSIX的东西)
请记住,bashdb(bash 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
没问题。
打印每个已执行命令的另一种方法是将trap
与DEBUG
一起使用。
将此行放在脚本的开头:
trap 'echo "# $BASH_COMMAND"' DEBUG
您可以找到许多其他trap
用法here。