我在运行 macOS High Sierra 的 MacBook Pro 上设置环境变量时遇到问题。
在终端中,我尝试通过执行来设置环境变量export VARIABLE_URL=example.com
。然后我尝试检查环境变量是否设置为echo $VARIABLE_URL
,但返回空白结果。
现在每当我启动终端时,我都会收到这条消息:
Last login: Tue Apr 2 15:08:56 on ttys000
[1] Done export VARIABLE_URL=example.com
[2] Done appVersion=
[3] Done osVersion=
[4] Done deviceType=
[5]+ Done deviceId=
My-MacBook-Pro:~ me$
我尝试将变量添加到我的.bash_profile
文件中,但即使这样也没有正确设置变量。每次我这样做echo $VARIABLE_URL
,它都会返回空白。
我在 my 中设置了其他变量.bash_profile
,但这是我的计算机拒绝添加的唯一变量。
即使在我执行时printenv
,也会显示除VARIABLE_URL
.
为什么我不能设置这个环境变量?
编辑:这是我的内容.bash_profile
:
export BACKEND=example
export VARIABLE_URL=example.com
export HOST=localhost
export BASEURL=example
export SECRET=example
export USERNAME=example
export ACCESS_KEY=example
Edit2:这是我现在打开终端时显示的内容:
Last login: Wed Apr 3 13:06:20 on ttys000
+ export BACKEND=example
+ BACKEND=example
+ export 'VARIABLE_URL=example.com'
+ VARIABLE_URL='example.com'
+ appVersion=
+ osVersion=
+ deviceType=
+ clientType=
+ export HOST=localhost
+ HOST=localhost
+ export BASEURL=example
+ BASEURL=example
+ export SECRET=example
+ SECRET=example
+ export USERNAME=example
+ USERNAME=example
+ export ACCESS_KEY=example
+ ACCESS_KEY=example
+ deviceId=
My-MacBook-Pro:~ me$
...这是printenv
执行时返回的内容:
TERM_PROGRAM=Apple_Terminal
USERNAME=example
SHELL=/bin/bash
TERM=xterm-256color
TMPDIR=/var/folders/g6/q9bwlzxn36jfb2j53c5t_t080000gn/T/
Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.GZQ9CxlO7F/Render
TERM_PROGRAM_VERSION=404.1
TERM_SESSION_ID=45B1D3A5-719E-4C24-9026-C52A374B3809
USER=me
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.nXK7LMtVZx/Listeners
BACKEND=example
SECRET=example
HOST=localhost
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Wireshark.app/Contents/MacOS
PWD=/Users/me
LANG=en_US.UTF-8
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0
SHLVL=1
HOME=/Users/me
LOGNAME=me
ACCESS_KEY=example
BASEURL=example
_=/usr/bin/printenv
My-MacBook-Pro:~ me$
最终编辑:它已经解决了!在 URL 中添加单引号就可以了:
export VARIABLE_URL='example.com'
我应该明确解释这个问题中显示的 URL 是一个占位符 URL,而不是我的.bash_profile
. 实际的 URL 实际上包含多个&
字符。很抱歉没有从一开始就解释清楚。我觉得如果我这样做了,问题就会早点解决。不管怎样,感谢大家的帮助和建议,我很高兴现在一切都解决了。
从你从 .bash_profile 得到的输出,我猜你有这样的东西:
你不想要
&
那里的“”字符,它们以无关紧要和无用的方式改变了意义。export
您可以通过用空格分隔它们来在单个命令中定义一堆环境变量:export
或者为每个变量使用单独的命令可能更清楚:顺便说一句,“
&
”造成麻烦的原因是它是命令之间的分隔符,并在命令在后台运行之前发出命令。因此,每个赋值都被视为一个完全独立的命令(只有第一个是 anexport
,其余是未导出的 shell 变量),除了最后一个在单独的进程中在后台运行,并且定义是这些进程的本地(并且消失时这些过程完成)。这就是所有那些“完成”行的含义——它们表明那些后台进程已经完成。我的假设:
您的实际 URL 使用 HTTP GET 方法,如下所示:
其中
?
和&
是 URL 语法的一部分,但 shell 对它们的解释不同。&
使前面的命令在后台运行。它也是一个分隔符,所以你有多个而不是一个命令。第一个是并将此值导出为
VARIABLE_URL
.另一个假设:
shopt -s nullglob
是活动的,因此?
来自 GET 语法的 unquoted$VARIABLE_URL
会在没有文件匹配 pattern 的任何目录中扩展为空字符串example.com?foo=bar
。你要
其中单引号使外壳按字面意思对待
?
和&
字符(双引号也适用于此特定示例;但我不知道您的实际 URL,单引号通常更安全)。此外双引号防止通配(否则会因为
?
变量内容而发生),而不管nullglob
当前目录中的文件。