有几个地方可以设置环境变量。
~/.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 < ~/.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"
:
另外,请注意在登录时运行的其他程序可能会在启动代理之前执行,因此可能看不到它设置的环境变量。