测试/调试时的 Bash 条件重定向

测试/调试时的 Bash 条件重定向

为了测试和调试目的,在 Bash 中有条件地执行重定向的最佳方法是什么?

在我的脚本中,我添加了一个调试选项,以显示在没有任何处理的情况下进行测试运行会发生什么。如果启用了调试选项,我希望 DEBUG 选项能够有效地通过重定向回显脚本行回应重定向,而不是重定向回显举个例子也许能更好地解释这一点:

在使用传递给它的参数执行 mysqldump 的脚本中,我希望调试选项显示 mysqldump 命令,因为它在没有 -d 选项的情况下会运行。

[ "-d" = "$1" ] && DEBUG=echo
$DEBUG mysqldump -u"$user" -p"$pass" -h"$host" "$dbase" > $dbase.sql.dump

因此,如果我回显,因为 DEBUG 是“echo”,则我不想回显到“$dbase.sql.dump”,我实际上想回显“>”和“$dbase”变量以及“.sql.dump”文本。如果调试选项未打开,我想按原样运行命令。

set -x和选项set -v并不是真正的答案,因为调试实际上只是用户可以看到的测试输出/试运行选项,而不是真正调试脚本来修复编码问题。

答案1

问题在于如何正确地转义所有内容。为什么不尝试一下稍微不同的方法呢?例如:

CMD='mysqldump -u"$user" -p"$pass" -h"$host" "$dbase" > "$dbase.sql.dump"';
[ "-d" = "$1" ] && echo $CMD
eval $CMD

诀窍是将命令保存为变量,然后仅在调试时打印该变量。这样就无需将其写出两次,然后您就可以使用eval变量来执行它包含的命令。

相关内容