題 在OS X 10.6 Snow Leopard中,$ PATH在哪裡設置?


我打字 echo $PATH 在命令行上獲取

/opt/local/bin:/opt/local/sbin:/Users/andrew/bin:/usr/local/bin:/usr/local/mysql/bin:/usr/local/pear/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/usr/local/git/bin

我想知道自從我這樣做以來它在哪裡 .bash_login 文件是空的。

我特別擔心的是,在安裝MacPorts後,它安裝了一堆垃圾 /opt。我不認為該目錄甚至存在於正常的Mac OS X安裝中。

更新: 謝謝 jtimberman 糾正我的 echo $PATH 聲明


132
2017-11-11 18:48


起源


評論來自 SMcCandlish:easiest solution when you want to make a site-wide path change (e.g. to include /usr/libexec or whatever) is to edit  /etc/paths  . While the new  /etc/paths.d/  thing is functional, it's actually more hassle than maintaining a single file. As others have hinted but not spelled out, if the path changes you want would be useful only for one user, it's best to make that change in the bash and/or tcsh config files in that user's home directory instead of system-wide. - Sathya♦
@Sathya,在我看來 /etc/paths.d 對安裝腳本很有用。如果我希望我的安裝腳本將已安裝的程序添加到路徑中,我可以刪除文件 /etc/paths.d。如果我想手動編輯路徑, /etc/paths 是一個更好的選擇。 - haydenmuhl
我已經製作了一個主要基於這篇文章的腳本,它可以快速打印出沿多個位置定義PATH的位置: gist.github.com/lopespm/6407349952bc8a1ff8fb - Pedro Lopes


答案:


什麼時候 bash 每次登錄時,它都會讀取以下文件。出於OS X的目的,這意味著每次打開一個新的 Terminal 窗口。

/etc/profile
~/.bash_profile
~/.bash_login   (if .bash_profile does not exist)
~/.profile      (if .bash_login does not exist)

通過鍵入啟動新shell時 bash 在命令行上,它讀取 .bashrc

OS X也使用 ~/.MacOSX/environment.plist 設置更多環境變量,包括必要的路徑。

最後, /etc/paths 和 /etc/paths.d 也被shell讀取。


/opt/local/bin 等等 ~/.tcshrc 通過MacPorts。另外一定要看看 ~/.cshrc


152
2017-11-11 20:57



顯然, ~/.MacOSX/environment.plist 對某些人不起作用。在 OS X的更改路徑 使用該文件夾的替代方案 /etc/paths.d 被描述。我沒有測試過。 - Arjan
+1為 ~/.cshrc。堅果試圖找出原因 ~/.profile 沒用。 - tomlogic
我認為這個答案是不完整的。我試圖找出錯誤的(不存在的)路徑:/ usr / bin / local,我的shell在抱怨,而且它不在任何這些文件中。 - Tommy
我認為 .bashrc 無論您輸入內容,都會被閱讀 bash 或不。 - Xiao Peng - ZenUML.com


看看文件 /etc/paths,用於 /usr/libexec/path_helper,用於 /etc/profile

對於MacPorts,請使用 sudo /etc/paths/opt/local/bin 並重新打開終端窗口。


47
2017-12-30 20:31





說真的,Leopard為我們提供了一種增加路徑的新方法。只需創建一個包含要添加的路徑部分的文件,並將其放在/etc/paths.d中

一步完成此操作的簡單示例如下:

echo "/some/path/to/add" >> /etc/paths.d/somefilename

否則,您可以直接轉到/etc/paths.d並將文件放在那裡。無論哪種方式,該目錄中文件中的任何路徑部分都將附加到默認路徑。

這也適用於manpath。

這是一個更多細節的鏈接:

ars technica:我如何在雪豹中添加一些東西給PATH?

在第二個註釋:MacPorts正確地將所有內容放入opt目錄中,因為它沒有被Apple的東西使用。這樣就不會發生衝突。他們的指南(出色的寫作,BTW)解釋了為什麼它使用opt以及如果你願意如何更改默認值。

MacPorts指南


25
2018-03-25 18:07



很酷。現在我們只需要讓這些依賴路徑的應用程序不再污染我們的配置文件...... - Daniel Beck♦
愛它。簡單! - Andrew Hedges
評論來自 SMcCandlish: I have to concur that there's nothing weird or bad about MacPorts using   /opt  (likewise Fink uses /sw); trying to replace stock Mac BSD parts with bleeding-edge builds from external projects like these is a recipe for an unusable system that requires an OS reinstallation. - Sathya♦
單行,無附加文件,易於刪除。喜歡這個。謝謝leanne - Ibrahim Lawal


要顯示您的路徑,請回顯$ PATH。

echo $PATH

要設置路徑,請進行編輯 ~/.bash_profile不是 ~/.bash_login


4
2017-11-11 19:07





還有確定的路徑 SSH

相比 echo $PATH 至 ssh localhost 'echo $PATH'。由於ssh不讀取/ etc / profile,因此/ usr / libexec / path_helper不會運行,因此會跳過/ etc / paths。現在試試 ssh localhost 'source /etc/profile; echo $PATH'。路徑應該更近。剩下的差異可能是由於.bash_profile(也被ssh跳過)和.bashrc(由ssh讀取)中的路徑修改。

如果您希望ssh路徑與普通終端路徑類似,則可以添加 source /etc/profile 到你的.bashrc。


3
2018-02-07 19:36



謝謝你的提示!我正在尋找ssh的解決方案。 svn + ssh無法準確找到svnserve命令,因為svnserve的路徑在.profile中,但不在.bashrc中。 - KIR


它可以定義為:

  • 系統變量 - /etc/paths
  • 用戶變量 - 請參閱@Steve Folly的解釋

2
2018-06-01 09:50





實際上它存儲在你的 .profile 文件而不是 .bash_login MacPorts通常會使用它來代替 .bash_login 文件。

也是 /opt 目錄通常由MacPorts創建,並將其文件存儲在此文件夾中。


1
2017-11-11 19:13





關於 文檔 對於 /usr/libexec/path_helper 實用程序,$ PATH的初始組件取自 /etc/paths默認情況下看起來像

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

適用於OS-X Snow Leopard


1
2018-06-26 01:40