題:
在OSX Yosemite中,為什麼我可以為GUI應用程序設置許多環境變量,但不能設置特定的變量PATH
halloleo
2014-10-28 15:05:34 UTC
view on stackexchange narkive permalink

在對Mavericks發行版中的整理了OSX的PATH問題之後,問題又在優勝美地再次出現了!!!

所以我想模仿Mac OSX 10.10 Yosemite新發行版中的舊 launch.conf 功能,以便在 Carbon這樣的GUI應用程序中使用PATH環境變量可以使用Emacs RStudio。我使用stackoverflow用戶 ursa的好主意來設置一個Shell腳本,該腳本通過 launchctl 配置環境變量。 (請參見他的stackoverflow答案此處。)這適用於大多數環境變量,但不適用於PATH變量

1。我做了什麼?

首先,我寫了 /etc/environment.rc 腳本,如下所示:

  launchctl setenv PATH / Users / halloleo / bin:/ usr / texbin:/ usr / local / bin:/ usr / bin:/ bin:/ usr / sbin:/ sbinlaunchctl setenv JAVA_HOME /usr/local/jdk1.7launchctl setenv ENVIRONMENT_RC“是”  

然後,我為 launchd 創建了plists(這些附件以及下面附錄中提到的其他腳本的列表)。然後我用

  $ sudo launchctrl load激活了它們...  

然後我在外殼初始化文件中禁用了 path_helper 實用程序 / etc / 配置文件,以便它不會覆蓋 environment.rc 設置。最後,我重新啟動了計算機。

2。有什麼作用?

啟動終端時,根據 environment.rc 設置了新的環境變量 JAVA_HOME ENVIRONMENT_RC >,但PATH設置為

/ usr / bin:/ bin

為了確保沒有妨礙我的 bash 初始化文件而是(在附錄中)編寫了一個小python腳本來顯示當前環境中的變量,我通過雙擊 Platypus包裝器直接執行此操作。再次設置新變量,而PATH為系統默認值。

那為什麼我可以設置其他變量,但不是 PATH變量呢?而我該如何以統一的方式解決這個問題?

更新:

情況非常令人困惑:shell(至少在Terminal或Emacs中使用 bash )將獲取您通過 launchctl 設置的PATH,但其他GUI應用程序則不會。通過Platypus直接調用的上述最小python腳本不會顯示您的自定義路徑。甚至Emacs本身也不知道正確的路徑:例如,您注意到了當您發出Emacs命令 M-x ispell-buffer 時;如果只是在您的自定義路徑上,則找不到emacs嘗試調用的unix工具 ispell


附錄

net.halloleo.environment.plist / Library / LaunchDaemons / 中啟動的配置文件:

  <?xml版本=“ 1.0”編碼=“ UTF-8”?><!DOCTYPE plist PUBLIC“-// Apple // DTD PLIST 1.0 // EN”“ http://www.apple.com/DTDs/對propertyList-1.0.dtd“><plist版本=”1.0“><dict> <key>KeepAlive< / key> <false / > <key>Label< / key> <string>net.halloleo.environment< / string> <key>ProgramArguments< / key> <array> <string> / bin中/ sh< / string> <str ing>的/ etc / environment.rc< / string> < / array> <key>RunAtLoad< / key> <true / > <key>WatchPaths< / key> <array> <string>的/ etc / environment.rc< / string>
< / array>< / dict>< / plist>  

net.halloleo.environment-user.plist / Library / LaunchAgent中啟動的配置文件/

  <?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版本=“1.0”><dict> <key>KeepAlive< / key> <false / > <key>Label< / key> <string>net.halloleo.environment-user< / string> <key>ProgramArguments< / key> <array> <string> / bin / sh< / string> <string> / etc /環境ent.rc< / string> < / array> <key>RunAtLoad< / key> <true / > <key>WatchPaths< / key> <array> <string>的/ etc / environment.rc< / string> < / array>< / dict>< / plist> 代碼> 

/ etc / profile ,修改後的bash啟動文件:

 #sh(1)#的系統範圍.profile,如果[-x / usr / libexec / path_helper];然後#eval`/ usr / libexec / path_helper -s`#fiif [“ $ {BASH-no}”!=“ no”];然後[-r / etc / bashrc] &&。 / etc / bashrcfi  

show_environ.py ,該腳本顯示所有環境變量:

 導入osprint(os.environ) 
三 答案:
ursa
2014-10-28 15:15:57 UTC
view on stackexchange narkive permalink
優勝美地中的

PATH可以並且應該在/ etc / paths文件中設置。只需將您的路徑添加到此文件的末尾即可:

  / usr / bin / bin /您的/ custom / path  

/ etc / environment腳本原始帖子在GUI應用程序中提供了對PATH變量的支持(已通過Emacs測試)。

這僅對在初始化過程中調用`/ usr / libexec / path_helper`的shell有效。 GUI應用程序*不*根據`/ etc / paths`獲取PATH-我專門詢問了GUI應用程序。
我已經在原始帖子中更新了答案和/ etc / environment腳本
這是您給出的兩個答案-OP也說/ etc / environment不起作用
@mark(1)出現此問題之後,我已經更新了/ etc / environment,現在它確實支持PATH。 (2)答案是使用/ etc / paths
對不起,ursa,對我來說,即使我使用`/ etc / environment`而不是`/ etc / environment.rc`(作為文件名並在文件中引用),在啟動的GUI環境*中的PATH仍然是`/ usr / bin:/ bin`。在Carbon Emacs中,通過雙擊finder(!)啟動並且沒有`.emacs`文件,請檢查`exec-path`或`process-environment'的值。
好。嘗試執行以下步驟:(1)在終端調用“ launchctl setenv PATH / your / custom / path:/ bin:/ usr / bin”中(2)重新啟動Dock應用程序“ osascript -e'告訴應用程序“ Dock”退出”'( 3)使用Spotlight啟動Emacs(4)菜單>工具> Shell命令> echo $ PATH。它打印什麼?
為我工作。 `sudo vim / etc / paths`然後重啟並運行良好。謝謝。
@ursa對不起,我的回复很晚。當我執行您建議的四個步驟時,我得到您提到的結果,但這並不意味著PATH **在Emacs的環境中**的設置正確,僅表明由shell命令啟動的shell得到正確的路徑。這是一個非常令人困惑的情況。我將使用這些詳細信息更新問題。
我期望的是@halloleo-Emacs中的shell命令啟動了一個新的shell,該shell讀取了/ etc / path和.bashrc等,但是Emacs本身並未通過shell機制被調用
@mark是的,這正是我的觀點,問題和問題:通過Finder啟動時,如何設置GUI應用本身的環境變量PATH?不過,目前還沒有真正的*通用*解決方案...
Claude
2014-12-18 23:59:07 UTC
view on stackexchange narkive permalink

這困擾了我很長時間(嗯,最近幾個小時)。最後,我遇到了這個錯誤報告,似乎準確地描述了我的問題(我不確定該問題與您的問題有關的擴展,但是優勝美地/啟動似乎與PATH和腳本等結合存在一個錯誤作為python:

http://www.openradar.me/18945659

解決方案似乎是啟動一個shell腳本,然後再啟動python 。不是我真正喜歡的東西,而是它的樣子....

感謝您提供的錯誤報告鏈接。到目前為止,這是一個真正的錯誤。我發現周圍還有另一個離合器。我將其張貼在這裡。
StenSoft
2015-06-24 21:39:19 UTC
view on stackexchange narkive permalink

問題在於,launchd會附加另一個PATH變量,而不是替換環境中的那個。大多數程序使用 getenv 來始終返回變量的第一個匹配項,而shell會遍歷所有環境變量並將其作為局部變量導入,從而用最後一個實例覆蓋先前的實例。

顯然,這是啟動時的錯誤,傳遞給程序的環境變量應該是唯一的。

很酷的背景答案!我猜在shell中沒有真正的解決方法,還是存在?
@halloleo您可以將命令啟動為`sh -c'您的原始命令',然後通過外殼將其傳遞,並選擇在launchd中設置的“ PATH”。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...