我正在尝试让Bash正确执行以下最小化示例:
# Runs a command, possibly quoted (i.e. single argument)
function run()
{
$*
}
run ls # works fine
run "ls" # also works
run "ls `pwd`" # also works, but pwd is eagerly evaluated (I want it to evaluate inside run)
run "ls \\\`pwd\\\`" # doesn't work (tried other variants as well)
总结一下,我试图获得在带引号的字符串(或没有)中使用命令的能力,并且没有任何命令,包括通过反引号,计算值等嵌套的shell命令,在run()之前进行评估叫做。这可能吗?我怎样才能做到这一点?
答案 0 :(得分:7)
这样做的方法是使用与转义'$'相关联的eval函数:
function run()
{
eval $*
}
my_command="ls \$(pwd)"
将'$'转换为'\ $',确保my_command设置为“ls $(pwd)”而不进行替换。然后eval将提供替换^^
然后
run $my_command
cd ..
run $my_command
证明你获得了你的功能!
MY2C