为什么bash实际上使用单引号和双引号?

时间:2018-08-19 18:31:21

标签: bash docker docker-compose environment-variables

我有一个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上安装Bash 4,通常默认为ash shell

更新

这开始看起来像是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的人吗?

1 个答案:

答案 0 :(得分:7)

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

  

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

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

尤其是,该env文件不是Shell脚本,也不为bash所看到(您的#!/usr/bin/env bash行被视为注释并被忽略了。)