1. 程式人生 > >在Mac下為GUI程式設定環境變數

在Mac下為GUI程式設定環境變數

轉載:http://zodiacg.net/2013/05/set-path-under-mac/

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中新增如下內容:

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檔案。並且重啟後才能生效。而能夠即時設定即時生效的方法是沒有的……

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外掛的一些功能就不需要手動從終端啟動程式了。