200

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

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


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


编辑:

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

4

10 回答 10

312

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

  • ~/.profile:将其用于您要在从终端启动的所有程序中设置的变量(注意,与 Linux 不同,在 Terminal.app 中打开的所有 shell 都是登录 shell)。
  • ~/.bashrc:这是为不是登录 shell 的 shell 调用的。将其用于需要在子 shell 中重新定义的别名和其他内容,而不是用于继承的环境变量。
  • /etc/profile: 这是在 ~/.profile 之前加载的,但在其他方面是等效的。当您希望变量应用于机器上所有用户启动的终端程序时使用它(假设他们使用 bash)。
  • ~/.MacOSX/environment.plist:这是由登录窗口在登录时读取的。它适用于所有应用程序,包括 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 是根进程。要将更改应用到正在运行的 root 启动,您可以将命令通过管道传输到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"

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

于 2010-12-31T00:33:07.510 回答
153

没有必要重复。您可以使用launchctl setenv.

例如,如果您想在将当前路径设置在.bashrc或任何位置后将其镜像到 launchd:

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

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

于 2010-09-21T01:20:54.273 回答
12

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

给你:

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

于 2010-12-02T14:23:53.867 回答
8

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

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

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

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

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

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

于 2009-03-02T20:13:52.647 回答
5

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

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

于 2009-03-02T20:10:36.833 回答
4

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

我还在这里发布了一个相关问题的答案。

于 2015-09-04T21:10:14.813 回答
3

只需通过终端打开~/.profile文件并在此处键入:nano

export PATH=whatever/you/want:$PATH

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

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

于 2012-04-12T09:03:43.187 回答
0

我编写了一个工具来轻松管理 macOS 应用程序的环境变量。

https://github.com/yuezk/macenv

您可以使用 设置环境变量~/.macenv set,例如:

~/.macenv set JAVA_HOME /path/to/java/home

在后台,它调用launchctl setenv设置环境变量,~/.launchd.conf同时保存环境变量,并注册一个自动启动服务以在操作系统重新启动时加载环境变量。

于 2022-01-07T08:38:26.177 回答
-1

如果要在 macOS 上永久更改环境变量,请将它们设置为/etc/paths. 请注意,此文件默认为只读,因此您必须chmod以获得写入权限。

于 2015-11-29T21:10:04.617 回答
-2

对于 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到.

于 2020-04-18T04:58:06.070 回答