【问题标题】:Why is bash using single and double quotes literally?为什么 bash 从字面上使用单引号和双引号?
【发布时间】:2019-01-25 23:44:10
【问题描述】:

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

MY_PATH="/home/my/path"

> cd $MY_PATH

结果

bash: cd: "/home/my/path": No such file or directory


> 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 的人吗?

【问题讨论】:

  • 你确定你使用"作为双引号,而不是
  • 是的,非常确定。单引号也是同样的问题。
  • echo $MY_PATH | od -x 并发布结果。
  • OK, 除了' 之外还存在。
  • bash-4.4# echo $MY_PATH | od -x 0000000 2f22 6f68 656d 6d2f 2f79 6170 6874 0a22 0000020

标签: bash docker docker-compose environment-variables


【解决方案1】:

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

这些语法规则适用于.env 文件:

  • Compose 要求 env 文件中的每一行都采用 VAR=VAL 格式。
  • # 开头的行将作为 cmets 处理并被忽略。
  • 空白行被忽略。
  • 没有对引号的特殊处理。这意味着它们是 VAL 的一部分

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
相关资源
最近更新 更多