Mac是一个类Unix环境(BSD based),但是终究是有所不同……尤其是在环境变量的设置这一点上,其操作比起Windows甚至都略有不如。

在Linux下如果想设置环境变量,只要在用户主目录下的profile文件或者bash_profile里设置响应的export语句即可。而在Mac下,其GUI程序和终端程序使用了两套不同的环境变量设置。修改profile文件仅仅在使用终端的时候生效,如果想要GUI程序也能继承相应的环境变量设置,则需要从终端启动应用程序才可以。想要为从LauncherPad或Finder中启动的GUI程序设置环境变量的话,则需要额外的步骤。

在网络上能找到的方法也很多,但是随着Mac OSX版本的升级,很多方法在Mountain Lion下已经无效了。经过很多尝试和折腾之后,我总算是基本弄清楚了在Mac下设置环境变量的方法。下面将分两个部分进行说明:普通环境变量的设置方法,和PATH的设置方法。

以下方法在Yosemite下已失效或部分失效,请参考新的文章


I.普通环境变量的设置方法

1.临时设置的方法

临时设置普通环境变量的方法比较简单。只要在终端中执行launchctl setenv语句并重新启动GUI程序即可。格式为:

1
launchctl setenv 环境变量名 环境变量内容

比如设置Java相关的环境变量的命令为:

1
launchctl setenv JAVA_VERSION 1.6

之后重新启动相应的应用程序就可以了。如在Sublime Text 2里调出console,然后输入:

1
2
import os
os.environ["JAVA_VERSION"]

即可看到结果

2.重启不失效的设置方法

自Mountain Lion以来,之前原有的environment.plist的方法已经确定失效了。新的有效的方法是在/etc/launchd.conf中添加指令设置环境变量。
这个文件默认并不存在,可以自己建立。其内容则与launchctl执行的指令的格式相同。如上述设置可在/etc/launchd.conf中添加如下内容:

1
setenv JAVA_VERSION 1.6

需要注意的是,在launchd.conf中的命令有一些限制。首先是不能进行环境变量的引用。比如再设置JAVA_HOME环境变量的话,不能使用类似/System/Library/Frameworks/JavaVM.Framework/$JAVA_VERSION/Home的方式来引用之前设置的JAVA_VERSION环境变量,必须明确写出1.6。同时环境变量的内容中也不允许出现空格。

launchd.conf仅在系统启动时被调用,因此修改完成后需要重启才能看到效果。

II. PATH的设置方法

或许是出于安全方面的考虑,PATH的设置方法比普通的环境变量的设置复杂的多。有几个方法是传的比较广的,但是我自己尝试均无效。比如/etc/paths.d/目录下建立文件的方法,对GUI程序也是无效的,仅在终端下生效。上面提到的launchctl命令临时设置的方法,对其他环境变量有效,但是对PATH无效。我在Sublime Text 2里进行尝试,能够获取到我随意设置的测试用环境变量,但是PATH始终是/usr/bin:/bin:/usr/sbin:/sbin的默认设置。
以及在国外某问答网站上有人提到的,需要在单个应用程序里的Info.plist文件里设置LSEnvironment的dict/key对来设置的方法,实际上也是无效的……

有效的方法只有一个,那就是上面提到的重启不失效的方法,直接修改launchd.conf文件。并且重启后才能生效。而能够即时设置即时生效的方法是没有的……

1
setenv PATH /Users/leoliu/.nvm/v0.8.22/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

上面就是我安装了node和brew后的PATH设置。在Sublime Text 2里用Python的API测试后发现终于生效了……这样想要使用Sublime Text 2的Nodejs插件的一些功能就不需要手动从终端启动程序了。