我在 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 会吞噬外部引号,甚至不确定在尝试解决此问题时要搜索什么。
为了完全限定场景,让我指出:
- 将 Docker 与 Alpine (3.8) 镜像一起使用
- 在 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
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 inVAR=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/