如何在Bash中的可能引用的变量中推迟反引号(或$())?

时间:2011-01-12 12:31:30

标签: bash escaping

我正在尝试让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()之前进行评估叫做。这可能吗?我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:7)

这样做的方法是使用与转义'$'相关联的eval函数:

function run()
{
    eval $*
}

my_command="ls \$(pwd)"

将'$'转换为'\ $',确保my_command设置为“ls $(pwd)”而不进行替换。然后eval将提供替换^^

然后

run $my_command
cd ..
run $my_command

证明你获得了你的功能!

MY2C