我應該如何在 Mac 上設定 PATH 變數以便找到 Hombrew 安裝的工具?

我應該如何在 Mac 上設定 PATH 變數以便找到 Hombrew 安裝的工具?

正在嘗試設定自製在新的 Mac 上(在以前的 Mac 上,我會從原始碼安裝軟體包)。

我嘗試安裝的第一個套件是 Git:

$ brew install git

安裝順利,但仍顯示隨附的which git內容/usr/bin/git獅子(我認為?)。而不是/usr/local/bin/git剛安裝的那個。

$ echo $PATH
/Users/meltemi/.rvm/gems/ruby-1.9.2-p290@rails31/bin:/Users/meltemi/.rvm/gems/ruby-1.9.2-p290@global/bin:/Users/meltemi/.rvm/rubies/ruby-1.9.2-p290/bin:/Users/michael/.rvm/bin:/usr/local/mysql/bin:/opt/subversion/bin:/Developer/Additions/checker/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

正如您所看到的,/usr/bin預設值是之前/usr/local/bin$PATH

所以,我很困惑!我認為重點是自製啤酒(以及創建者似乎吹噓的事情)是你不必弄亂變數$PATH! ?

那麼,我做錯了什麼?

答案1

我發現這篇相關文章非常有幫助。您無需更改$PATH變量,只需編輯/etc/paths文件即可。

Homebrew 希望我修改我的 PATH;不知道如何

一旦我按照/usr/local/bin上面的說明進行操作/usr/bin,我的問題就解決了。

  1. 在 OS X 上,開啟終端
  2. 輸入命令:sudo vi /etc/paths
  3. 如果系統要求您輸入密碼,請輸入密碼
  4. 您將看到路徑清單。編輯它們,以便在/usr/local/bin路徑上方輸入/usr/bin路徑
  5. *儲存並退出
  6. 重啟終端

這是我這樣做後的樣子:

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

*要儲存並退出,請鍵入冒號 ( :),然後鍵入wq(同時寫入和退出),然後鍵入Enter

您也可以/etc/paths在圖形文字編輯器中開啟該檔案並以這種方式進行編輯。

歸功於馮德 在 Stack Overflow 尋找他的答案。

答案2

這個答案已經過時了。首選的 HomebrewPATH順序曾經如所解釋的那樣,但現在不再正確了。然而,該方法更普遍適用,因此出於興趣,我將其保留。


你不應該。

Homebrew 故意保留/usr/local/bin /usr/bin在路徑中以獲得最大相容性。PATH透過編輯顛倒這些目錄的順序/etc/paths意味著全部系統上任何位置的程序,無論它們是如何啟動的,都將獲得命令的 Homebrew 版本。但有些人可能特別期望蘋果的版本,或者只是無法使用更新的版本,等等。

如何保留這項原則並仍然獲得 Homebrew 安裝的版本git?俗話說,所有問題都可以透過一層間接解決(除非間接層太多)。 ——或者在這種情況下,事實證明,是兩層。

~/bin具體來說,我的 Unix習慣的一部分是在PATH.這是我的第一部分之一.bashrc

[[ :$PATH: == *:$HOME/bin:* ]] || PATH=$HOME/bin:$PATH

這會檢查是否PATH包含~/bin,如果沒有,則在其前面添加。完成後,然後選擇性地使 Homebrew 管理的版本git優先於系統版本(而不是每一個自製管理的二進位檔案),並且僅用於您的 shell 會話(而不是全部從任何地方啟動的程序,包括 GUI 程式),就像符號連結一樣簡單:

ln -s /usr/local/bin/git ~/bin/git

可以直接符號鏈接,但是每次執行(直接或間接)/usr/local/Cellar/git/1.8.2.1/bin/git時都必須修復符號鏈接。brew upgrade git透過符號連結到 Homebrew 的固定位置符號鏈接,您不必擔心它。

所以你添加一個目錄到你的目錄中$HOME,這樣你就可以將它添加PATH到你的符號鏈接中,這樣你的問題就解決了,蘇斯博士笑了。喲,天哪,我像符號鏈接一樣聚集你,所以我們在你的路徑中放置了一條路徑,PATH這樣你就可以在符號鏈接時進行符號鏈接。

答案3

你沒有做錯任何事,但看起來確實很清楚,如果你在這個特定問題/usr/local/bin之前出現在你的道路上,/usr/bin那麼這個問題就會消失。最簡單的解決辦法就是這樣做並放置類似的東西

export PATH=/usr/local/bin:$PATH

在你的~/.bash_profile目錄中,首先找到 Homebrew 安裝的所有內容。這就是我在 Mac 上設定它的方式,而且它已經對我工作了很長時間了,YMMV。

看來他們確實相信這會/usr/local/bin /usr/bin,所以雖然我可能搞砸了我自己的$PATH,但我可以看到他們的文檔缺少的地方:

請注意,您應該放在/usr/local/bin後面,/usr/bin 因為某些程式會期望取得系統版本(例如 ruby​​),並且如果它們取得較新的 Homebrew 版本,則會中斷。

wiki 與 brew doctor 之間的差異 #10738。請注意,本文檔接著說:“常見問題解答(上述引用)指的是 GUI 應用程式的 PATH 設定;醫生(放在/usr/local/binPATH/usr/bin 中的建議)指的是 CLI 應用程式的 PATH 設定。”

答案4

據我了解,brew不會將任何內容放入/usr/local/bin與 Apple 分散式執行檔發生衝突(具有相同名稱)的內容中。因此,/usr/local/bin在先前的路徑中包含/bin/usr/bin應該不是問題,因為不應該有名稱衝突。 *但是,請參閱ls和的問題tar,以及使用其他套件聚合器(如fink和(MacPorts))的問題port,如下所示。

Brew據我所知,執行以下兩項有助於管理名稱衝突的操作之一:

  1. Brew將未連接的小桶留在地窖中。 為了安裝東西,brew 將工具保留在原來的位置,並在/usr/local/bin.對於不希望名稱衝突的工具brew,它不會建立符號連結。
  2. /bin對於許多(如果不是全部)也包含在和中的標準工具/usr/binbrew在連結中添加前綴/usr/local/bin“g”,因此,例如,要ls使用 brew 版本執行 ,請使用gls 只需執行ls -lin操作/usr/local/bin並找到連結的檔案 - 這些檔案就brew放在那裡。注意:brew必須實名存取的已安裝工具可在 中找到/usr/local/Cellar/coreutils/8.21/libexec/gnubin

我不/usr/local/bin這樣做有兩個原因——這些原因在我的答案的底部。

要評估系統中的名稱衝突,請使用brew doctor並尋找此部分 - 這是brew doctor感興趣的輸出:

Warning: /usr/bin occurs before /usr/local/bin
This means that system-provided programs will be used instead of those
provided by Homebrew. The following tools exist at both paths:

    ctags
    emacs
    emacsclient
    etags
    ex
    git
    git-cvsserver
    git-receive-pack
    git-shell
    git-upload-archive
    git-upload-pack
    rview
    rvim
    view
    vim
    vimdiff
    vimtutor
    xxd

Consider setting your PATH so that /usr/local/bin
occurs before /usr/bin. Here is a one-liner:
    echo export PATH='/usr/local/bin:$PATH' >> ~/.bash_profile

我之所以沒有把brew的工具放在第一位,事實上根本不是,是因為brew安裝的命令lstar命令沒​​有正確處理檔案系統 ACL,事實上,我上次檢查時(這是上週),他們根本沒有被處理。這是一個大問題,為了完全避免它,以及man與設定正確標記相關的頁面配置問題$PATH,我確保首先放置相關工具,尤其是在和OSX中找到的工具。/bin/usr/bin

我甚至根本沒有放入/usr/local/bin我的路徑的另一個原因是因為brew與其他人不能很好地配合,並且finkportMacPorts)目前有更多我需要的受支援的軟體包現在。例如,我可以得到gnome-terminalfink但是建立一個公式並用 做同樣的事情將需要很大的努力brew。因此,我在搜尋中保留/sw和(分別為和)並引用我需要的內容,包括,要么拼寫出來,要么我使用's ,或者在編寫程式碼時為完全不同的環境獲取文件。/opt$PATHfinkport/usr/local/bingnatbash aliassetupAda

問題是,這實際上取決於您當時想要什麼和需要什麼。

這是我上面提到的 ACL 問題的一個例子。

使用標準OSX工具:

$ /bin/ls -le /var/root | head -7
total 24
drwx------+  3 root  wheel  102 May 28  2013 Desktop
 0: group:everyone deny delete
 1: user:_spotlight inherited allow list,search,readattr,readextattr,readsecurity,file_inherit,directory_inherit
drwx------+  6 root  wheel  204 Sep 19 14:22 Documents
 0: group:everyone deny delete
 1: user:_spotlight inherited allow list,search,readattr,readextattr,readsecurity,file_inherit,directory_inherit

並使用brew已安裝的工具:

$ /usr/local/bin/gls -le /var/root
/usr/local/bin/gls: invalid option -- 'e'
Try '/usr/local/bin/gls --help' for more information.

$ /usr/local/bin/gls --help | grep -i acl

tar我不知道還有多少其他工具會得到類似的結果brew,但誰能承受得起 6 個月後因為某個ACL問題而導致某些東西損壞的後果呢!

相關內容