Mac OS X中的环境变量


186

更新:下面的链接 没有完整的答案。必须在两个位置(一个用于GUI,一个用于shell)设置路径或变量,这很la脚。

不重复在OS X中设置环境变量吗?


由于Windows背景非常容易设置和修改环境变量(只需转到“系统属性”>“高级”>“环境变量”),在Mac OS 10.5上似乎并不是那么简单。大多数参考资料都说我应该更新/ etc / profile或〜/ .profile。这些等同于系统变量和用户变量吗?例如,我应该在哪里设置JAVA_HOME变量?


编辑:

我希望能够从终端以及像Eclipse这样的应用程序中访问变量。另外,我希望不必重新启动/注销即可生效。


链接问题的答案中有一些建议,这里不再赘述...
dmckee ---前主持人小猫

Answers:


142

无需重复。您可以使用以下命令设置已启动(以及子进程,即从Spotlight开始的任何事物)使用的环境变量launchctl setenv

例如,如果要在以下位置.bashrc或任何位置设置后在启动时镜像当前路径:

PATH=whatever:you:want
launchctl setenv PATH $PATH

在运行的应用程序中,环境变量不会自动更新。您将需要重新启动应用程序以获取更新的环境变量(尽管您可以仅在shell中设置变量,例如PATH=whatever:you:want;无需重新启动终端)。


1
看起来是迄今为止最好的答案,不需要第三方应用程序!
Abdullah Jibaly 2010年

2
这似乎不是全局的:以这种方式设置的环境变量对于用户而言是本地的。我们仍然没有用于设置环境变量的全局机制。
Andrew

@Andrew对用户而言是什么意思?我希望随后从启动开始的所有过程都会受到影响。
马特·柯蒂斯

@MattCurtis:通过设置的环境变量launchctl setenv似乎仅对进行更改的用户可见。如果我将变量设置为普通用户,则对于root用户(通过sudo)不可见,反之亦然。
安德鲁

2
@Andrew好的,root已经启动了- ps aux | grep launchd将显示此内容。还要检查man sudo,哪些文档sudo(默认情况下)是故意重置环境的-如果您sudo -E将保留该环境(包括您使用设置的变量launchctl setenv)。顺便说一下,您对此有实际的应用程序吗?如果是这样,此方法对您有用吗?
马特·柯蒂斯

299

您可以在几个地方设置环境变量。

  • ~/.profile:将其用于您要在从终端启动的所有程序中设置的变量(请注意,与Linux不同,在Terminal.app中打开的所有shell都是登录shell)。
  • ~/.bashrc:对于不是登录shell的shell调用此方法。将其用于别名和其他需要在子shell中重新定义的内容,而不用于继承的环境变量。
  • /etc/profile:此代码在〜/ .profile之前加载,但在其他方面等效。当您希望变量应用于计算机上所有用户启动的终端程序时(假设他们使用bash),请使用它。
  • ~/.MacOSX/environment.plist:登录时由loginwindow读取。它适用于所有应用程序,包括GUI应用程序,但Spotlight在10.5(不是10.6)中启动的应用程序除外。它要求您注销并再次登录以使更改生效。从OS X 10.8开始不再支持此文件。
  • 您的用户launchd实例:这适用于用户,GUI和CLI启动的所有程序。您可以使用中的setenv命令随时应用更改launchctl从理论上讲,您应该能够将setenv命令放入~/.launchd.conf,并且launchd可以在用户登录时自动读取命令,但是实际上从未实现过对该文件的支持。相反,您可以使用另一种机制在登录时执行脚本,并调用该脚本launchctl来设置launchd环境。
  • /etc/launchd.conf:这是在系统启动和用户登录时由launchd读取的。它们会影响系统上的每个进程,因为launchd是根进程。要将更改应用于启动的正在运行的根目录,可以将命令通过管道传递到sudo launchctl

要了解的基本知识是:

  • 环境变量在分支时由进程的子代继承。
  • 根进程是一个启动的实例,每个用户会话也有一个单独的启动实例。
  • launchd允许您使用更改其当前环境变量launchctl;然后,更新的变量将被此后分叉的所有新进程继承。

使用launchd设置环境变量的示例:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

现在,启动使用该变量的GUI应用程序,瞧!

要解决不起作用的事实,~/.launchd.conf可以将以下脚本放入~/Library/LaunchAgents/local.launchd.conf.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>local.launchd.conf</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl &lt; ~/.launchd.conf</string>    
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

然后,你就可以把setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE里面~/.launchd.conf,它会在每次登录时被执行。

请注意,以这种方式将命令列表通过管道传送到launchctl时,将无法使用包含空格的值来设置环境变量。如果需要这样做,可以按如下所示调用launchctl:launchctl setenv MYVARIABLE "QUOTE THE STRING"

另外,请注意,登录时运行的其他程序可能在启动代理之前执行,因此可能看不到它设置的环境变量。


3
实际上,关于 ~/.MacOSX/environment.plist,在我的Lion上读取并使用它。刚刚测试。我实际上比.launchd.conf更喜欢它,因为我使用RCenvironment首选项窗格来维护它。
2011年

5
无法~/.launchd.conf在10.6.8上工作-它似乎没有任何作用。手册页还说当前不支持该文件。
snowcrash09 2011年

4
〜/ .launchd.conf似乎也无法在10.7.3上运行,当我在手册页中查看时,它说$ HOME / .launchd.conf您启动的配置文件(当前不受支持)
创意的

4
在10.8(Mountain Lion)中,不再支持〜/ .MacOSX / environment.plist。根据Apple Dev的说法,必须“更改.app本身的Info.plist使其包含具有所需环境变量的“ LSEnvironment”字典。欲了解更多信息,请参阅apple.stackexchange.com/questions/57385/...
pnkfelix

3
@LaC很棒的综合帖子;您能否更新它以指出~/.launchd.conf仍不支持并且在OS X 10.8.3上不起作用?请参阅man launchd.conf
mklement0

12

我认为OP正在寻找一种简单的,类似于Windows的解决方案。

你去这里:

https://www.macupdate.com/app/mac/14617/rcenvironment


1
哇,这看起来很棒。还没有尝试过,但是看起来确实像我在描述中所需要的。
Abdullah Jibaly

6
顺便说一句,自从我发布它以来,原始链接似乎已断开(Apple怎么回事?301的价格昂贵?)。您可以改用以下链接:macupdate.com/app/mac/14617/rcenvironment
Tom

这真的很旧。请查看提及osx-env-sync的其他答案,以获取即使在OS X 10.10(Yosemite)及更高版本中也可以使用的现代解决方案。
沃伦·P

1
请总结您答案中链接中的信息。正如我们已经看到的,链接由于各种原因而断开。
user3.1415927 '19

7

您可以在linux上进行阅读,这与Mac OS X非常接近。或者,您可以在距离BSD Unix更近的地方阅读。在大多数情况下,Linux和BSD之间的差异并不大。

/etc/profile 是系统环境变量。

~/.profile 是用户特定的环境变量。

“我应该在哪里设置JAVA_HOME变量?”

  • 您有多个用户吗?他们在乎吗?您会通过更改来将其他用户弄乱/etc/profile吗?

通常,即使我是唯一的用户,我也不希望弄乱系统范围的设置。我更喜欢编辑本地设置。


5

对于GUI应用程序,您必须创建和编辑~/.MacOSX/environment.plist在这里更多细节。您需要注销才能使它们生效。我不确定它们是否还会影响从Terminal启动的应用程序,但我认为会。

对于从终端启动的应用程序,您还可以编辑〜/ .profile文件。


2
是的,Terminal将继承变量,就像从Terminal启动的任何东西一样。您可以使用RCenvironment首选项窗格来维护变量。
2011年

1
此解决方案不再适用于Mac OS X v10.7的某些修订版。它不适用于Mac OS X v10.8或更高版本。相反,请参阅:stackoverflow.com/a/4567308/543738
LS

3

只需在Terminal中~/.profile通过打开文件,然后nano在其中输入:

export PATH=whatever/you/want:$PATH

保存此文件(cmd + X和Y)。之后,请再次注销/登录,或者只是在Terminal中打开一个新选项卡,然后尝试使用新变量。

请不要忘记在任何/您/想要的后面添加“:$ PATH”,否则您将擦除PATH变量中之前的所有路径。


4
这仅适用于bash命令环境。GUI应用程序看不到您在此处设置的变量。
沃伦·P

3

使用osx-env-sync从单一来源同步命令行和GUI应用程序的OS X环境变量

我还张贴回答一个相关的问题在这里


这是太棒了。建议:将launchctl卸载/ launctl加载“立即刷新”的内容放入脚本中。我称它为osx-env-sync-now.sh。我修改.bash_profile并运行小的“立即刷新”脚本并继续。我认为这里存在安全隐患,因此我认为应该进行一些限制。必须有他们在OS X把这个功能关闭的原因
沃伦P

@WarrenP完成!检查仓库。
Ersin Er

优秀的。这为我解决了很多痛苦。对于使用SCALA开发的任何人,这确实有用的一种情况。否则,为命令行scala和GUI scala(例如在netbeans中)都设置SCALA_HOME是一件很痛苦的事情。
沃伦·P

0

如果要在macOS上永久更改环境变量,请在中进行设置/etc/paths注意,此文件默认情况下是只读的,因此您必须使用chmod来获得写权限。


这对我不起作用。我已经/usr/bin/local在该文件中,即使不修改该文件,默认情况下也是如此,但是我的GUI应用程序只能看到/usr/bin:/bin:/usr/sbin:/sbin。我重启了很多次。
mgol

@m_gol运行时您会得到什么cat /etc/paths/
IgorGanapolsky '16

1
/ usr / local / bin,/ usr / bin,/ bin,/ usr / sbin,/ sbin,以单独的行显示。但是SourceTree可以看到除第一个以外的所有其他对象。
mgol

您可能需要编辑为“如果要更改macOS中的默认路径 ”。这与更一般的环境变量问题无关。
rfay

0

对于2020 Mac OS X Catalina用户:

忘记其他无用的答案,这里只需要两个步骤:

  1. 创建一个具有以下命名约定的文件:priority-appname。然后复制粘贴要添加的路径PATH

    例如80-vscode/Applications/Visual Studio Code.app/Contents/Resources/app/bin/我的内容。

  2. 将该文件移到/etc/paths.d/。不要忘记在终端中打开一个新选项卡(新会话)并键入echo $PATH以检查是否添加了路径!

注意:此方法仅您的路径附加PATH

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.