簡體   English   中英

Mac OS X 中的環境變量

[英]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 啟動的所有程序。 您可以隨時使用launchctlsetenv命令應用更改。 理論上,您應該能夠將setenv命令放在~/.launchd.conf ,並且launchd會在用戶登錄時自動讀取它們,但實際上從未實現對此文件的支持。 相反,您可以使用另一種機制在登錄時執行腳本,並讓該腳本調用launchctl來設置launchd環境。
  • /etc/launchd.conf :它在系統啟動和用戶登錄時由 launchd 讀取。它們影響系統上的每個進程,因為 launchd 是根進程。 要將更改應用於正在運行的 root launchd,您可以將命令通過管道sudo launchctlsudo 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 &lt; ~/.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 ;無需重新啟動終端)。

我認為 OP 正在尋找的是一個簡單的、類似 windows 的解決方案。

來吧:

https://www.macupdate.com/app/mac/14617/rcenvironment

您可以在 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 用戶:

忘記其他無用的答案,這里只需要兩個步驟:

  1. 使用命名約定創建一個文件:priority-appname。 然后將要添加的路徑復制粘貼到PATH

    例如80-vscode與內容/Applications/Visual Studio Code.app/Contents/Resources/app/bin/在我的情況下。

  2. 將該文件移動到/etc/paths.d/ 不要忘記在終端中打開一個新選項卡(新會話)並輸入echo $PATH以檢查您的路徑是否已添加!

注意:此方法僅您的路徑附加PATH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM