我有一个名为“run”的shell函数,通常只是将其参数视为命令行(即,好像没有使用'run()'。)但是,如果脚本在a中运行$TESTMODE
,则'run() ' 将回显其参数,而不是:
run ()
{
cmd="$@"
if [ -z "$TESTMODE" ]; then
$cmd
else
echo "### RUN: '$cmd'"
fi
}
这个想法是,该命令run rm -Rf /
通常会尝试删除整个根文件系统。但是,如果定义了 $TESTMODE,那么它会回显
### RUN: rm -Rf /
它工作得很好,直到您尝试在包含重定向的命令行上使用 run() :
run which which
run which bash >quiet
在这种情况下,当$TESTMODE
定义时,echo
人眼将永远无法看到所需的内容:
$ rm quiet
$ TESTMODE=yes ./runtest.sh
### RUN: 'which which'
$ cat quiet
### RUN: 'which bash'
我试图用字符串替换来纠正这个问题:
run ()
{
cmd="$@"
if [ -z "$TESTMODE" ]; then
$cmd
else
cmd=${cmd//\>/\\>}
cmd=${cmd//\</\\<}
echo "### RUN: '$cmd'"
fi
}
...在命令行测试中似乎很有希望:
$ test1="foo >bar"
$ echo $test1
foo >bar
$ test2=${test1//\>/\\>}
$ echo $test2
foo \>bar
...但在我的 bash 脚本中惨遭失败(行为没有明显变化)。
帮助?我确信这与引用有关,但我不确定如何解决它。