在 macOS High Sierra 的终端中设置环境变量时遇到问题

在 macOS High Sierra 的终端中设置环境变量时遇到问题

我在运行 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,它都会返回空白。

我已经在我的中设置了其他变量.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

编辑2:这是我现在打开终端时显示的内容:

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,而不是我的 URL 中实际的 URL .bash_profile。实际 URL 确实包含多个&字符。很抱歉一开始没有解释这一点。我觉得如果我这样做了,问题就会更快得到解决。无论如何,感谢大家的帮助和建议,我很高兴现在一切都解决了。

答案1

我的假设:

您的实际 URL 使用 HTTP GET 方法,如下所示:

export VARIABLE_URL=example.com?foo=bar&appVersion=&osVersion=&deviceType=&deviceId=&fizz=buzz

其中?&是 URL 语法的一部分,但 shell 对它们的解释不同。&使前面的命令在后台运行。它也是一个分隔符,因此您有多个命令,而不是一个命令。第一个是

export VARIABLE_URL=example.com?foo=bar

并且该值被导出为VARIABLE_URL

另一个假设:shopt -s nullglob是活动的,因此?来自 GET 语法的 导致未引用的$VARIABLE_URL在任何没有与模式匹配的文件的目录中扩展为空字符串example.com?foo=bar

你要

export VARIABLE_URL='example.com?foo=bar&appVersion=&osVersion=&deviceType=&deviceId=&fizz=buzz'

单引号使 shell 按字面意思处理?&字符(双引号也适用于此特定示例;但我不知道您的实际 URL,单引号通常更安全)。此外

echo "$VARIABLE_URL"

双引号可防止通配符(否则会由于?变量内容而发生通配符),无论nullglob当前目录中是否存在文件。

答案2

根据您从 .bash_profile 获得的输出,我猜其中包含类似这样的内容:

export VARIABLE_URL=example.com & appVersion= & osVersion= & deviceType= & deviceId= & somethingelse=

您不需要&那里的“ ”字符,它们会以不相关且无用的方式改变含义。您可以在单个export命令中定义一组环境变量,用空格将它们分隔开:

export VARIABLE_URL=example.com appVersion= osVersion= deviceType= deviceId= somethingelse=

export或者对每个变量使用单独的命令可能会更清楚:

export VARIABLE_URL=example.com
export appVersion=
export osVersion=
export deviceType=
export deviceId=
export somethingelse=

顺便说一句,“ ” 造成麻烦的原因&是它是命令之间的分隔符,并使它之前的命令在后台运行。因此,每个赋值都被视为完全独立的命令(只有第一个是export,其余的是未导出的 shell 变量),并且除了最后一个之外的所有命令都在后台运行在单独的进程中,并且这些定义只针对这些进程(当这些进程结束时,这些定义也会消失)。这就是所有这些“完成”行的含义 - 它们表示这些后台进程已经完成。

相关内容