bash - shell脚本: running cmd that was passed into a function

标签 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 破坏内容?

最佳答案

请务必阅读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 的 shell $CMD 退出。

关于bash - shell脚本: running cmd that was passed into a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22620672/

相关文章:

c++ - QProcess 返回退出代码 0

linux - 检查特定列中的值是否与下一行的同一列中的值相同?

string - 如何在unix中剪切特定字符后的字符串

java - 对 Java 插件控制面板的编程访问

java - JRuby 和 Java 对象

svn - 递归目录 svn 移动 shell 脚本

linux - 根据参数将 bash 中的命令替换为其他命令

linux - 为什么不取命令行的第一行作为输出

linux - 在linux中搜索分隔文件中的字符串,然后打印该字符串直到到达下一个分隔符

linux - 运行从网络 curl 的 bash 脚本