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

qod*_*nja 6 bash environment-variables docker docker-compose

我有一个Bash的情况,我以前从未遇到过,也不知道如何解决.我在Alpine Linux(Docker Container)上安装了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,通常默认为灰壳

更新

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

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

container.env

#!/usr/bin/env bash
MY_PATH="/home/my/path"
Run Code Online (Sandbox Code Playgroud)

然后在Alpine 3.8集装箱内运行 env

MY_PATH="/home/my/path"

更新2

看起来周围有一个关闭bug.但显然似乎并不固定.是因为我是宇宙中唯一还在使用Docker Toolbox的人吗?

mel*_*ene 7

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

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

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

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