bash - 为什么 bash 从字面上使用单引号和双引号?

标签 bash docker docker-compose environment-variables

我在 Bash 中遇到了以前从未遇到过的情况,不知道如何解决。我在 Alpine Linux(Docker 容器)上安装了 bash,出于某种原因,带有引号的环境变量会逐字翻译。

MY_PATH="/home/my/path"

> cd $MY_PATH

结果

bash: cd: "/home/my/path": 没有这样的文件或目录


> echo $MY_PATH

结果

"/home/my/path"


现在,如果您不带引号尝试它,它会起作用

MY_PATH=/home/my/path

> cd $MY_PATH

结果

bash-4.4#(路径已更改)


> echo $MY_PATH

结果

/home/my/path


我以前从未见过这种情况,因为我希望 bash 会吞噬外部引号,甚至不确定在尝试解决此问题时要搜索什么。

为了完全限定场景,让我指出:

  1. 将 Docker 与 Alpine (3.8) 镜像一起使用
  2. 在 Alpine 上安装通常默认为 ash shell 的 Bash 4

更新

这开始看起来像一个 docker 问题。我正在使用 env_file in Docker Compose将环境变量推送到容器中,它看起来就像是从字面上复制引号 "=>\"

感谢@bishop 的评论尝试od -x

container.env

#!/usr/bin/env bash
MY_PATH="/home/my/path"

然后在运行 env

的 Alpine 3.8 容器内

MY_PATH="/home/my/path"

更新 2

好像有一个 bug around this that was closed.但显然似乎并不固定。是因为我是世界上唯一还在使用 Docker Toolbox 的人吗?

最佳答案

https://docs.docker.com/compose/env-file/

These syntax rules apply to the .env file:

  • Compose expects each line in an env file to be in VAR=VAL format.
  • Lines beginning with # are processed as comments and ignored.
  • Blank lines are ignored.
  • There is no special handling of quotation marks. This means that they are part of the VAL.

特别是,env 文件不是 shell 脚本,bash 看不到(您的 #!/usr/bin/env bash 行被视为注释并被忽略)。

关于bash - 为什么 bash 从字面上使用单引号和双引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51920675/

相关文章:

ssl - 获取ssl证书的问题

docker - 如何使用 docker-compose 重启单个容器

bash - 如何将 stdin 从 shell 脚本重定向到 shell 脚本中的命令?

linux - 从 bash 脚本添加 ssh 并自动输入密码

mysql - 在 bash 脚本中创建 mysql 数据库和用户

docker-compose : Issue with . 环境路径

ruby - Rspec测试针对Docker容器失败

bash - 如何在 bash 脚本中使用参数名称作为变量

docker - Traefik:前端未定义后端

docker compose-如何设置名称属性