shell脚本:运行传递给函数的cmd

时间:2014-03-24 21:11:06

标签: bash shell scripting

我有一个bash脚本:

function run_cmd
{
    CMD="$@"
    echo ">>> $CMD"
    exec $CMD
}

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

但是,当我运行此命令时,我的'package'命令会出现使用错误。如果我使用复制+粘贴运行命令,它可以正常工作。

它似乎不喜欢我在$ CLUSTERS_PKG变量中传递空格和引号。如何正确运行传递给run_cmd的“一切”没有shell破坏东西?

2 个答案:

答案 0 :(得分:1)

您可以使用BASH ARRAYS:

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

答案 1 :(得分:1)

请务必阅读the link posted by Adrian Frühwirth。这个答案实际上只是对那里建议的简短总结。


如果你传递这样的论点:

run_cmd "package upload -c '$CLUSTERS_PKG'"

然后您必须在函数中使用eval,以便将单引号视为引用运算符:

run_cmd () {
    CMD="$@"
    echo ">>> $CMD"
    eval "$CMD"
}

如果您传递这样的参数:

run_cmd package upload -c "$CLUSTERS_PKG"

然后你可以在你的函数中使用一个数组(比使用eval更安全):

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

您真的需要才能使用exec;事实上,您可能不会这样做,因为这会导致当前流程被CMD替换:您不会在run_cmd之后返回到调用$CMD的shell退出。