[英]Environment variables in Mac OS X
更新:下面的鏈接沒有完整的答案。 必須在兩個地方(一個用於 GUI,一個用於 shell)設置路徑或變量是很蹩腳的。
不重復: 在 OS X 中設置環境變量?
來自 Windows 背景,設置和修改環境變量非常容易(只需轉到“系統屬性”>“高級”>“環境變量”),在 Mac OS 10.5 上似乎並不那么簡單。 大多數參考資料都說我應該更新 /etc/profile 或 ~/.profile。 那些等同於系統變量和用戶變量嗎? 例如,我應該在哪里設置我的JAVA_HOME
變量?
編輯:
我希望能夠從終端以及像 Eclipse 這樣的應用程序訪問變量。 另外,我希望我不必重新啟動/注銷才能使其生效。
有幾個地方可以設置環境變量。
~/.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 啟動的所有程序。 您可以隨時使用launchctl
的setenv
命令應用更改。 理論上,您應該能夠將setenv
命令放在~/.launchd.conf
,並且launchd
會在用戶登錄時自動讀取它們,但實際上從未實現對此文件的支持。 相反,您可以使用另一種機制在登錄時執行腳本,並讓該腳本調用launchctl
來設置launchd
環境。/etc/launchd.conf
:它在系統啟動和用戶登錄時由 launchd 讀取。它們影響系統上的每個進程,因為 launchd 是根進程。 要將更改應用於正在運行的 root launchd,您可以將命令通過管道sudo launchctl
到sudo launchctl
。要理解的基本內容是:
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"
。
另請注意,登錄時運行的其他程序可能會在啟動代理之前執行,因此可能看不到它設置的環境變量。
沒有必要重復。 您可以使用launchctl setenv
設置由 launchd(和子進程,即您從 Spotlight 啟動的任何程序)使用的環境變量。
例如,如果您想在.bashrc
或其他任何地方設置后在 launchd 中鏡像當前路徑:
PATH=whatever:you:want
launchctl setenv PATH $PATH
環境變量不會在運行的應用程序中自動更新。 您將需要重新啟動應用程序以獲取更新的環境變量(盡管您可以只在 shell 中設置變量,例如PATH=whatever:you:want
;無需重新啟動終端)。
您可以在 linux 上閱讀,這與 Mac OS X 非常接近。 或者你可以在 BSD Unix 上閱讀,它更接近一些。 在大多數情況下,Linux 和 BSD 之間的差異並不大。
/etc/profile
是系統環境變量。
~/.profile
是用戶特定的環境變量。
“我應該在哪里設置我的 JAVA_HOME 變量?”
/etc/profile
弄亂其他用戶嗎?通常,即使我是唯一的用戶,我也不想弄亂系統范圍的設置。 我更喜歡編輯我的本地設置。
對於 GUI 應用程序,您必須創建和編輯~/.MacOSX/environment.plist
。 更多細節在這里。 您需要注銷才能使這些生效。 我不確定它們是否也會影響從終端啟動的應用程序,但我認為它們會。
對於從終端啟動的應用程序,您還可以編輯 ~/.profile 文件。
只需打開~/.profile
文件,通過終端中的nano
在那里輸入:
export PATH=whatever/you/want:$PATH
保存此文件(cmd+X 和 Y)。 之后,請再次注銷/登錄或在終端中打開一個新選項卡並嘗試使用您的新變量。
請不要忘記在任何/您/想要的之后添加 ":$PATH",否則您將刪除 PATH 變量中的所有路徑,這些路徑在此之前存在。
使用osx-env-sync從單一來源同步命令行和 GUI 應用程序的 OS X 環境變量。
我還張貼回答一個相關的問題在這里。
我編寫了一個工具來輕松管理 macOS 應用程序的環境變量。
https://github.com/yuezk/macenv
您可以使用~/.macenv set
環境變量,例如:
~/.macenv set JAVA_HOME /path/to/java/home
在launchctl setenv
,它調用launchctl setenv
來設置環境變量,同時將環境變量保存到~/.launchd.conf
中,並注冊一個自動啟動服務來在操作系統重啟時加載環境變量。
如果要在 macOS 上永久更改環境變量,請在/etc/paths
設置它們。 請注意,默認情況下此文件是只讀的,因此您必須chmod才能獲得寫入權限。
對於 2020 Mac OS X Catalina 用戶:
忘記其他無用的答案,這里只需要兩個步驟:
使用命名約定創建一個文件:priority-appname。 然后將要添加的路徑復制粘貼到PATH
。
例如80-vscode
與內容/Applications/Visual Studio Code.app/Contents/Resources/app/bin/
在我的情況下。
將該文件移動到/etc/paths.d/
。 不要忘記在終端中打開一個新選項卡(新會話)並輸入echo $PATH
以檢查您的路徑是否已添加!
注意:此方法僅將您的路徑附加到PATH
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.