我试图将这种命令mysql -e "SHOW TABLES;"
包装到bash函数中。
我尝试的命令是
mysql -hremote_id -uuser -ppass db -e "SHOW TABLES;"
显然这可以按预期工作。但由于某些原因我不明白,这会显示帮助输出:
run ()
{
local cmd=$1;
shift;
${cmd} $@
}
run mysql "-hremote_id -uuser -ppass db -e \"SHOW TABLES;\""
run mysql '-hremote_id -uuser -ppass db -e ""SHOW TABLES;"'
最后两行都显示帮助页面:
mysql Ver 14.14 Distrib 5.5.57, for Linux (x86_64) using readline 5.2
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
如何让它发挥作用?
答案 0 :(得分:2)
在run
中使用更多引号:
run () {
local cmd="$1"
shift
"$cmd" "$@"
}
并单独传递参数:
run mysql -hremote_id -uuser -ppass db -e "SHOW TABLES;"
你可能会看一下并问问自己"为什么我需要run
?"这是一个非常好的问题。我假设run
做的不仅仅是运行给定的命令。但是校长认为:个别论据应该保持个别论点。否则,您需要使用eval
,这需要完全正确且安全地使用其他级别的护理。
如果您手动将参数打包成字符串,请停止这样做。使用数组:
opts=(-hremote_id -uuser -ppass db -e "Show TABLES;")
run mysql "${opts[@]}"
如果你从其他地方收到这个单一的字符串,那么你需要做一些重要的重新设计。