为了测试和调试目的,在 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
变量来执行它包含的命令。