首页 > 解决方案 > 包装 mysql -e "cmd" 不起作用

问题描述

我正在尝试将这种命令包装mysql -e "SHOW TABLES;"函数中。

我正在尝试的命令是

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

我如何使它工作?

标签: bash

解决方案


在 中使用更多引号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[@]}"

如果您从其他地方接收到这个单个字符串,则需要进行一些重大的重新设计。


推荐阅读