我有一个 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/