2014-03-24 80 views
2

運行CMD我有一個bash腳本:shell腳本:這是傳遞給函數

function run_cmd 
{ 
    CMD="[email protected]" 
    echo ">>> $CMD" 
    exec $CMD 
} 

CLUSTERS_PKG="abc1, abc2" 
# run command 
run_cmd "package upload -c '$CLUSTERS_PKG'" 

然而,當我運行此命令時,我得到一個錯誤的使用與「包」命令。如果我用複製+粘貼運行該命令,它可以正常工作。

它似乎不喜歡我在$ CLUSTERS_PKG變量中傳遞空格和引號。如何正確運行傳遞到run_cmd而不是shell的東西?

+1

可能感興趣:[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)。 –

回答

1

請務必閱讀the link posted by Adrian Frühwirth。這個答案實際上只是對那裏發現的建議的簡短總結。


如果你通過這樣的論點:

run_cmd "package upload -c '$CLUSTERS_PKG'" 

,那麼你必須在你的函數中使用eval,使得單引號作爲引用運營商處理:

run_cmd() { 
    CMD="[email protected]" 
    echo ">>> $CMD" 
    eval "$CMD" 
} 

如果你傳遞這樣的參數:

run_cmd package upload -c "$CLUSTERS_PKG" 

那麼你可以使用一個數組中的功能(不是使用eval更安全):

run_cmd() { 
    CMD=("[email protected]") 
    echo ">>> ${CMD[@]}" 
    "${CMD[@]}" 
} 

你真的不需要使用exec;實際上,您可能沒有這樣做,因爲這會導致當前進程被CMD所取代:在退出$CMD後,您將不會返回到調用run_cmd的shell。

1

您可以使用BASH數組:

function run_cmd 
{ 
    arr=("[email protected]") 
    echo ">>> ${arr[@]}" 
    exec "${arr[@]}" 
} 
+1

如果引用'$ CMD',則整個字符串將傳遞給'exec'作爲要執行的命令的名稱。不過,陣列解決方案應該可以工作。 – chepner

+0

啊好點,我忽略了它。現在編輯。 – anubhava