Mac OS X中的环境变量

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

非副本: 在OS X中设置环境变量?


来自Windows的背景,设置和修改环境变量非常容易(只要去系统属性>高级>环境变量),在Mac OS 10.5上似乎没有那么直接。大多数引用都说我应该更新/etc/profile或~/.profile。这些变量是否等同于系统变量和用户变量?例如,我应该在哪里设置我的JAVA_HOME变量?


编辑:

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

249552 次浏览

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

对于从Terminal启动的应用程序,您还可以编辑~/。概要文件。

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

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

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

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

  • 您是否有多个用户?他们在乎吗?你会通过改变/etc/profile来扰乱其他用户吗?

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

没有必要重复。你可以使用launchctl setenv设置launchd(和子进程,即任何你从Spotlight启动的进程)使用的环境变量。

例如,如果你想在.bashrc或其他地方设置后在launchd中镜像当前路径:

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

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

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

来吧:

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

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

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

需要理解的基本事情是:

  • 环境变量在fork时由进程的子进程继承。
  • 根进程是一个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:

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

只要打开~/.profile文件,在终端中通过nano输入:

export PATH=whatever/you/want:$PATH

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

请不要忘记在/you/想要的东西后面加上“:$PATH”,否则你会删除PATH变量中之前的所有路径。

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

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

如果您想在macOS上永久地更改环境变量,请在/etc/paths中设置它们。请注意,默认情况下这个文件是只读的,所以你必须修改文件权限来获得写权限。

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

我写了一个工具来方便地管理macOS应用程序的环境变量。

https://github.com/yuezk/macenv

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

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

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