Mac OS X“El Capitan”:无法读取用户设置的Bash环境变量

3

我有一个shell脚本,用于导出一些与构建软件项目相关的环境变量(如Android密钥库位置)。

通常情况下,当我调用这个脚本时,环境变量就会被导出,并且IDE可以访问它们,Bash终端上的export命令也是如此。

自从我安装了Mac OS X El Capitan以来,由Bash命令设置的环境变量就无法正常工作了。

export FOO="bar"

当我尝试通过某种方式访问它们时,它们没有返回

echo $FOO

在命令行中,我只得到了一个空白行。如果我在shell脚本中使用printenv,则会显示$F00

当我从Cash终端调用printenv时,$FOO被省略了。

我读到OS X“El Capitan”更新修复了bash相关的一些安全问题。这可能是原因吗?


所以你启动 Terminal.app,输入 export FOO="bar" 然后 echo $FOO 什么都没有输出? - trojanfoe
不,那个是有效的,但是如果 export $F00 在一个shell脚本里面,这个环境变量在脚本外部是不可用的。 - Till Krempel
2
如果应用程序无法访问,这是众所周知的,并且在此网站(不适用主题)和https://apple.stackexchange.com(适用主题)上都有相关信息。 - trojanfoe
1
我正在使用环境变量将Android密钥库位置传递给Android Studio IDE。它以前可以正常工作,但在更新到El Capitan之后就不再起作用了。我无法确定这些变量是否可供其他应用程序使用,但在更新之前,我可以通过bash终端应用程序获取这些变量,现在却不能了。 - Till Krempel
2
@TillKrempel:你意识到你不断地在 FOO(字母“o”)和 F00(零)之间交替使用吗?如果你在这里犯了这个错误,也许你在你的脚本或者 shell 中也会犯。 - Ken Thomases
2个回答

1
你不能在以 shebang 脚本(即第一行以 #! 开头并且是可执行文件的路径名)开始的脚本中修改或导出 shell 中的变量,因为这会创建一个独立的进程来执行脚本,而它导出的任何变量仅对其子进程可见。
只有通过使用 .(或 source)在当前进程中执行脚本,才能安排脚本修改当前 shell 中的变量。
例如,~/.bashrc~/.bash_profile~/.bash_logout 脚本直接由 shell 执行,因此它们可以设置或导出变量,以便由从 shell 运行的命令和子 shell 继承。

0

我遇到了类似的问题。看起来环境变量没有从bash传递给子进程。我通过显式地将我需要的变量添加到子进程中来解决了这个问题。

export MYVAR=foo
MYVAR=$MYVAR ./executable_to_launch

我很想知道是否有人找到了更好的解决方案。


你必须在每次登录时完成此操作。 - IgorGanapolsky
不要export这个变量。这是不必要且不可取的。当你导出一个变量时,它会被从shell启动的每个进程继承。你只应该导出那些你隐式期望子进程读取的变量。X=… command在命令的进程中设置变量X——它只将该变量导出给该进程。这是向子进程传递变量的最佳方式,而不会向所有其他子进程发送导出的变量。此外,在这个特定的例子中,导出它是多余的。 - Chris Page

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接