如何将左三角形(<)作为别名命令的一部分?

时间:2019-04-09 21:33:24

标签: linux bash docker

我正在容器化公司现有产品的过程中,并将MySQL数据库分离到另一个容器中。为了访问主容器中的MySQL服务器,我在./bashrc中创建了一个别名,以便于命令是:

mysql ...

它实际上运行以下命令:

docker exec -it ${MYSQL_CONTAINER} mysql ...

但是,如果命令包含左三角形以添加文件,例如:

mysql < test.sql

我有一个别名来复制文件并运行它,但是主容器所在的bash读取左三角形作为一个独立的组件,而不是参数列表的一部分。

如何使别名以左三角形作为参数的一部分?由于现有的外部软件会在脚本中运行该命令,因此我无法在引号中加上“

function mysql() {

  $1
  $2
  $3
  $4

  if [[ $1 == "--defaults-file=my.cnf" ]] && [[ ! $2 ]]; then
     docker exec -it ${MYSQL_CONTAINER} mysql $1
  elif [[ $1 == "--defaults-file=my.cnf" ]] && [[ $2 = "<" ]]; then
     #docker cp $3 $(docker inspect -f '{{.Id}}' ${MYSQL_CONTAINER}):/docker-entrypoint-initdb.d/
     #docker exec ${MYSQL_CONTAINER} sh -c "mysql $1 $2 docker-entrypoint-initdb.d/$3"
  elif [[ $1 == "-uroot" ]] && [[ ! $3 ]]; then
     docker exec -it ${MYSQL_CONTAINER} mysql $1 $2
  elif [[ $1 == "-uroot" ]] && [[ $3 = "<" ]]; then
     docker cp $4 $(docker inspect -f '{{.Id}}' ${MYSQL_CONTAINER}):/docker-entrypoint-initdb.d/
     docker exec ${MYSQL_CONTAINER} sh -c "mysql $1 $2 $3 docker-entrypoint-initdb.d/$4"
  else
     docker exec -it ${MYSQL_CONTAINER} mysql $1
  fi

}

2 个答案:

答案 0 :(得分:0)

您需要引号或转义<字符,否则它会由原始Shell作为输入重定向操作符进行处理:

mysql '<' test.sql

然后将<从字面上传递给您的函数,并将其传递给docker

答案 1 :(得分:0)

如果有人来这里寻找答案,我发现了解决问题的方法。我一直在寻找一种使命令行在使用别名时忽略stdin的方法,但是由于这似乎不太可能,所以我研究了如何使用它。

我试图从另一个与我的主机上的Docker守护进程连接的容器接触一个MySQL容器,并且可以运行docker命令。为了这个项目,我无法编辑现有命令,因此即使MySQL服务器存在于另一个容器中,我也必须使主容器使用mysql命令,所以我不得不四处玩耍。

function mysql() {

  $1
  $2

  if [[ $1 == "--defaults-file=my.cnf" ]]; then
    if [ -t 0 ]; then
       docker exec -it ${MYSQL_CONTAINER} mysql $1
    else
       cat > new_adapter.sql
       cat new_adapter.sql

       docker cp new_adapter.sql $(docker inspect -f '{{.Id}}' ${MYSQL_CONTAINER}):/docker-entrypoint-initdb.d/
       docker exec ${MYSQL_CONTAINER} sh -c "mysql $1 < docker-entrypoint-initdb.d/new_adapter.sql"

       rm -rf new_adapter.sql
    fi
  fi
}

在主容器上有一个.sql文件时,我不能简单地“