在 shell 脚本中,我们的企业编码标准需要使用...
set -x
command
set +x
。用于日志记录,而不是...
echo "doing command"
command
但是,当通配符是命令的一部分时,这可能会产生非常详细的输出。
例如。。。
for i in {1..10}; do touch $i.foo; done; # create 10 foo files
set -x # log command execution (stdout to be redirected to log file)
rm *.foo # delete foo files
set +x # end logging
。产生输出...
rm 10.foo 1.foo 2.foo 3.foo 4.foo 5.foo 6.foo 7.foo 8.foo 9.foo
对于 10 个文件来说还可以,但对于 10,000 个文件来说不是那么好。
所需的输出是...
rm *.foo
我的第一个想法是将 *.foo 放在引号中...
rm "*.foo"
但是,这给出了错误...
rm: cannot remove ‘*.foo’: No such file or directory
有没有办法使用 set -x 在不扩展通配符的情况下回显命令?
在许多情况下,简单的"-x"或"-v"不起作用(根据上面的注释(,并且保持在编码标准范围内(没有单独的回显(,请考虑:
VAR=/tmp/123
$SHELL -cv "ls $VAR/*"
这将执行命令,但会记录命令 WITH 变量替换、命令替换,但没有通配符替换。