【问题标题】:Mac OS X "El Capitan": cannot read user set Bash environment variablesMac OS X“El Capitan”:无法读取用户设置的 Bash 环境变量
【发布时间】:2016-01-22 18:37:50
【问题描述】:

我有一个 shell 脚本,它导出了构建软件项目所需的几个环境变量(Android 密钥库位置)。

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

由于我安装了Mac OS X El Capitan,Bash命令设置的环境变量

export FOO="bar"

当我尝试访问它们时不会返回

echo $FOO

在外壳上。相反,我只返回一个空行。

如果我在 shell 脚本中使用 printenv,则会显示 $F00

当我从现金终端拨打printenv 时,$FOO 不见了。

我了解到 OS X“El Capitan”更新修复了一些与 bash 有关的安全问题。会不会是这个原因?

【问题讨论】:

  • 所以你启动 Terminal.app,输入export FOO="bar" 然后echo $FOO 什么也没有产生?
  • 不,可以,但如果export $F00 在shell 脚本中,则环境变量在脚本之外不可用。
  • 它对应用程序不可用,例如?如果是这样,这是众所周知的,并且在本网站(不在主题范围内)和apple.stackexchange.com(在主题范围内)上都有介绍。
  • 我正在使用环境变量将 android 密钥库位置传递给 Android Studio IDE。它曾经工作得很好,但在更新到 El Capitan 之后它就不再工作了。我不知道这些变量是否可用于其他应用程序,但我能够在更新之前通过 bash 终端应用程序获取变量,现在我不能。
  • @TillKrempel:你意识到你一直在FOO(带有字母“哦”)和F00(带有零)之间交替,不是吗?如果你在这里犯了这个错误,也许你是在你的脚本或 shell 中犯的。

标签: macos bash shell environment-variables osx-elcapitan


【解决方案1】:

如果您正在这样做,您不能使用 shebang 脚本(第一行以 #! 和可执行文件的路径名开头的脚本)修改或导出 shell 中的变量,因为这会创建一个单独的进程执行脚本,它导出的任何变量只对其子进程可见。

您只能通过在当前进程中执行脚本来安排脚本来修改当前 shell 中的变量,例如.(或source)。

例如,~/.bashrc~/.bash_profile~/.bash_logout 脚本由 shell 直接执行,因此它们可以设置或导出要由 shell 运行的命令和子 shell 继承的变量。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。似乎环境变量没有从 bash 传播到子进程。我通过将我需要的变量显式添加到孩子来解决它。

    export MYVAR=foo
    MYVAR=$MYVAR ./executable_to_launch
    

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

    【讨论】:

    • 您必须在每次登录时执行此操作。
    • 不要export这个变量。这是不必要和不可取的。当您导出一个变量时,它会被您从 shell 启动的每个进程继承。您应该只导出您隐含期望子进程读取的变量。 X=… command 在命令的进程中设置变量 X — 它只将变量导出到该进程。这是将变量传递给子进程的最佳方式,而不会使用导出的变量向所有其他子进程发送垃圾邮件。此外,在这个特定示例中,导出它是多余的。
    猜你喜欢
    • 2018-11-12
    • 2016-06-11
    • 2016-08-11
    • 2014-10-12
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2017-07-08
    • 2013-11-27
    相关资源
    最近更新 更多