2011-01-12 84 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