2011-01-12 92 views
4

我试图让击到正确执行以下最小化例子:我想获得在引用的字符串为命令(或没有)的能力

# 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

请参阅[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)。 – 2011-01-12 15:38:27

回答

7

那么做这种事情的方法是使用带有一个转义“$”相关联的eval函数:

function run() 
{ 
    eval $* 
} 

my_command="ls \$(pwd)" 

逃离“$”为“\ $”确保my_command将被设置为“ls $(pwd)”没有替换。然后EVAL将提供替代^^

然后

run $my_command 
cd .. 
run $my_command 

证明你得到你的functionnality!

my2c