Mac OS X中的环境变量

时间:2009-03-02 20:07:20

标签: macos environment-variables

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

不重复Setting environment variables in OS X?


来自Windows背景,可以很容易地设置和修改环境变量(只需转到系统属性>高级>环境变量),它在Mac OS 10.5上似乎没那么直接。大多数参考文献都说我应该更新/ etc / profile或〜/ .profile。那些是系统变量和用户变量的等价物吗?例如,我应该在哪里设置JAVA_HOME变量?


编辑:

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

9 个答案:

答案 0 :(得分:287)

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

  • ~/.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实例,每个用户会话还有一个单独的launchd实例。
  • 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"

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

答案 1 :(得分:139)

不需要重复。您可以使用launchctl setenv设置launchd(和子进程,即从Spotlight开始的任何内容)使用的环境变量。

例如,如果您希望在.bashrc或其中的任何位置设置启动后镜像当前路径:

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

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

答案 2 :(得分:12)

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

这里你去:

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

答案 3 :(得分:7)

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

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

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

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

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

一般来说,即使我是唯一的用户,我也不想搞乱系统范围的设置。我更喜欢编辑我的本地设置。

答案 4 :(得分:5)

对于GUI应用,您必须创建和编辑~/.MacOSX/environment.plist。更多细节here。您需要注销才能生效。我不确定它们是否也影响从终端发起的应用程序,但我认为它们会。

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

答案 5 :(得分:3)

只需通过终端中的~/.profile打开nano文件,然后输入:

export PATH=whatever/you/want:$PATH

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

请不要忘记在/ you / want之后添加“:$ PATH”,否则你将删除PATH变量中的所有路径,这些路径就在那之前。

答案 6 :(得分:3)

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

我还发布了相关问题here的答案。

答案 7 :(得分:0)

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

答案 8 :(得分:-1)

对于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的路径。