bash - 包装 mysql -e "cmd" 不起作用
问题描述
我正在尝试将这种命令包装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
我如何使它工作?
解决方案
在 中使用更多引号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[@]}"
如果您从其他地方接收到这个单个字符串,则需要进行一些重大的重新设计。
推荐阅读
- javascript - 如何在条件下添加 2 个链接?反应JS
- javascript - Angular 7 测试依赖于私有方法的公共方法
- amazon-web-services - Terraform 中的 ECS 服务如何连接到 AWS 自动缩放组
- windows - 从批处理文件执行powershell命令时转义双引号
- python-3.x - 如何告诉 Spacy 不要使用 retokenizer 用撇号拆分任何单词?
- python - 应用程序验证和数据库验证之间的区别
- java - 有没有办法从属性文件值设置其余配置头?
- paypal-sandbox - 贝宝 | AxisFault:400 错误请求
- json - GET 方法状态为 401,但标头满足请求标头(邮递员)
- angular - Typescript Omit 属性不适用于“as”关键字