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