題 我應該如何在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 變量!?!

那麼,我做錯了什麼?


79
2017-08-17 19:36


起源


你之前是否弄亂了你的路徑並且可能把它們排錯了?此外,我不知道為什麼這是一個自吹自擂的“吹牛點”...它不像路徑的概念或修改它是一個複雜的事情,涉及創作和使用特殊權限或東西在你的系統中灑10個不同的plist .. .. - prodigitalson
路徑,以及與RVM無關的部分,應該是標準問題。不,我不是在抱怨不得不改變路徑。只是他們似乎重複了這一主張 If you choose /usr/local, everything 'just works!' 我不得不想知道我錯過了什麼...因為它不“只是工作”。 - Meltemi


答案:


我發現這篇相關帖子非常有幫助。而不是改變 $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 (同時寫和退出),然後是 輸入

你也可以打開 /etc/paths 文件在圖形文本編輯器中編輯並以這種方式編輯。

歸功於 fengd 在Stack Overflow上他的回答。


73
2018-01-13 22:35



對於vi dimwits(和我一樣),使用d來剪切一條線,並在命令模式下使用它來粘貼它 - Gerard
我會謹慎對待 - 更好的答案是修改.profile / .bash_profile中的路徑並將其導出到那裡。通過更改/ etc / paths,您(可能)會影響所有系統進程;更改.profile / .bash_profile中的PATH將首選項本地化為您的帳戶和通過命令shell調用的那些命令(在我的開發中,這是我想要的)。如果你真的很謹慎,你可以做@Aristotle Pagaltzis在下面的答案中提出的建議。 - rholmes
當你停下來考慮是否存在一些非常錯誤的問題時,從OSX設計的軟件包管理器中進行的簡單安裝是否已經開箱即用?改變你的路徑是一個潛在的破解“修復”和BTW,我偶然發現這個提議的修復的原因是brew也無法更新我的路徑,但“路徑”已經按正確的順序。另一個死胡同。停止瘋狂,解決根本原因。 - Rick O'Shea
還有,有 path_helper 和 /etc/paths.d。 - Simon Wright


這個答案已經過時了。首選的自製軟件 PATH 訂購過去就像解釋的那樣,但現在已不再適用。然而,這種方法更普遍適用,所以出於利益的考慮,我將其擱置。


你不應該。

Homebrew故意保留 /usr/local/bin    /usr/bin 在路徑中獲得最大兼容性。顛倒這些目錄的順序 PATH 通過編輯 /etc/paths 意思是 所有 系統中的任何程序,無論它們如何啟動,都將獲得Homebrew版本的命令。但有些人可能會特別期待Apple的版本,或者只是無法使用更新的版本等。

如何保持這個原則,仍然得到Homebrew安裝版本 git?俗話說,所有問題都可以用一層間接解決(除了有太多的間接層)。 - 或者在這種情況下,事實證明,兩層。

具體來說,我的Unix習慣是我的一部分 ~/bin 我放在我的開頭的目錄 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 所以你可以符號鏈接到一個符號鏈接,這可以修復你的問題並給蘇斯博士帶來微笑。喲dawg我喜歡你喜歡符號鏈接,所以我們在你的路上放了一條路 PATH 因此,您可以在符號鏈接時進行符號鏈接。


28
2018-04-09 23:28



很好,這完全解答了我的想法! - mydogisbox
這個SEEMS就像正確的答案,但我無法弄清楚要運行的確切命令。創建符號鏈接時,我一直收到“文件存在”。 - Ryan
抱歉,沒有足夠的細節來幫助你。 - Aristotle Pagaltzis
@Ryan確保你有正確的args順序 ln 命令。第一個路徑是目標,第二個路徑是符號鏈接 - Freedom_Ben
是的,在el cap上,我用過時的答案失敗並成功(我使用ZSH)編輯.zshrc中的路徑順序 export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" - Urs


你沒有做錯任何事,但如果你有,那似乎很清楚 /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醫生之間的差異#10738。 請注意,本文檔接著說, “FAQ(以上引用)是指GUI應用程序的PATH設置; 醫生(建議放 /usr/local/bin 在之前 /usr/bin 在你的PATH中)指的是CLI應用程序的PATH設置。“


16
2017-08-17 19:42



這不會留下兩個 /usr/local/bin在我的 $PATH?我相信是這樣。我想知道是否應該編輯默認路徑的順序 /etc/paths 或者的內容 /etc/paths.d?但這會影響每個用戶......也許並不是件壞事。無論如何,只是想看看其他人是如何接近這一點的。 - Meltemi
@Meltemi,這個答案的精神是正確的:更新你的 PATH (以你選擇的方式)擁有 /usr/local/bin 優於 /usr/bin。我親自更新我的 PATH 在 .bash_profile 如此處所示。
@Nick-有趣的信息......只會讓事情變得混亂(至少 我的 事情)...自製文件似乎暗示終端命令應該拿起應用程序 /usr/local/bin 即使它落後了 /usr/bin 在路上。但GUI應用程序需要特殊的溺愛嗎?這似乎 所有 應用程序,GUI與否,需要我們調整$ PATH變量。那麼,我(或自製的創作者)失踪了什麼? - Meltemi
我認為Homebrew假設你想首先使用Apple提供的可執行文件 - git是一個改變,直到Lion它不是Apple提供的,因此Homebrew需要它 - 現在你可以使用Apple了, - Mark
我同意馬克的觀點。對於MacPorts和Fink,我們的假設是提供一個完全原始的,獨立的環境,而不是蘋果公司提供的任何東西。 Homebrew採取的態度是Apple的東西很棒並且不要避免使用它(為什麼在Apple可能的情況下下載另一個版本的gcc?)。 - Nick Klauer


我不同意jthomas的回答。編輯/ etc / paths文件將更改所有程序的加載路徑。如果系統應用程序希望找到特定版本的二進製文件但找到不同的版本,因為您已編輯了路徑文件,這可能會很危險。而是在〜/ .bashrc(或〜/ .bash_profile)中更改路徑變量。那麼你的加載路徑只會在終端內部發生變化:

#將自製軟件應用程序添加到PATH
  export PATH = / path / to / homebrew / app / bin:$ PATH

然後重新加載bash或 source ~/.bashrc,你很高興。由於自製程序路徑先於其他任何內容,因此bash將加載您使用自製程序下載的版本。


6
2018-04-03 19:28



在OS X中, .bashrc 默認情況下未加載。你手動採購嗎? - slhck
哦耶。我來自Ubuntu的OS X,習慣了 .bashrc 所以我從我的來源 .bash_profile。如果您不想創建rc文件,可以將命令添加到您的 .bash_profile。 - Nathan


據我了解, brew 沒有任何東西 /usr/local/bin 與Apple分佈式可執行文件發生衝突(名稱相同)。因此,擁有 /usr/local/bin 在之前的路上 /bin 和 /usr/bin 不應該是一個問題,因為不應該有名稱衝突。 *但是,請參閱問題 ls 和 tar,以及使用其他包聚合器 fink 和 port (MacPorts),方式如下。

Brew 我知道的兩件事之一是幫助管理名稱衝突:

  1. Brew 在地窖裡留下無關聯的小桶。要安裝東西,brew會將工具留在原處,並創建指向這些工具的符號鏈接 /usr/local/bin。對於哪些工具 brew 不想與名稱衝突,它不會創建符號鏈接。
  2. 對於許多(如果不是全部)標準工具也是如此 /bin 和 /usr/binbrew 鏈接前綴為 /usr/local/bin 例如,用“g”表示執行 ls 使用brew版本,請使用 gls  只需做一個 ls -l 在 /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 安裝 ls 和 tar 命令不能正確處理文件系統ACL,事實上,我上次檢查(上週), 他們根本沒有得到處理。這是一個很大的問題,並且完全避免它,以及相關的問題 man 頁面配置問題,標籤以及設置 $PATH 對,我確保我把它 OSX 相關工具,特別是那些找到的工具 /bin 和 /usr/bin,首先。

我甚至沒有放的另一個原因 /usr/local/bin 在我的道路上是因為 brew 與其他人不一致,並且 fink 和 port (MacPorts)目前有更多支持包,我需要 現在。例如,我可以得到 gnome-terminal 同 fink,但要構建一個公式並做同樣的事情將是一個很大的努力 brew。所以,我保持 /sw 和 /opt 在我的搜索中 $PATH (對於 fink 和 port,分別)和參考我需要的東西 /usr/local/bin, 包含 gnat,要么拼寫,要么我使用 bash  alias或者我來源了 setup 在我寫作時,提供完全不同的環境 Ada 碼。

問題是,它實際上取決於您當時的需求和需求。

這是我上面提到的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 問題!


5
2018-01-03 22:07



感謝您提供有用的信息。但是,請注意,在我的系統上,我確實在/ usr / bin和/ usr / local / bin中都有相同名稱的可執行文件(例如,git,如符號所示,符號鏈接)。因此,默認情況下它們會發生衝突。我也想覆蓋我的shell工作的系統工具。 - rholmes


這裡有一大堆好的答案。這是我的:

echo >> ~/.bashrc alias my="PATH=/usr/local/bin:$PATH"
. ~/.bashrc
my git --version # Brew's fancy git
git --version # Apple's old crusty git

保存您必須為每個程序創建單獨的別名,作為獎勵,它可以在您需要時保留默認安裝。

如果您使用ZSH,則工作原理相同;剛剛換掉 bashrc 對於 zshrc。你可以換掉 my 對於 _ 甚至 @ 節省打字。


4
2017-09-18 20:46





根本沒有弄亂PATH(在我的歷史記錄中,幾個月之後又回來燒我)我在我的zsh自定義別名目錄中添加了git的別名(〜/ .zshrc / custom / git_alias.zsh)。

alias git='/usr/local/bin/git'


2
2017-07-30 18:47



我不知道......謝謝! - Meltemi


我更喜歡將更改限制為環境變量,例如 $PATH 對於實際想要更改的用戶。因此,我只需添加以下內容即可 ~/.bashrc

export PATH="$(brew --prefix)/bin:$PATH"

0
2018-03-21 11:54





您可以在終端中發出以下命令,它將在您的任何SHELL“rc”init文件的路徑中添加brew主目錄+ / bin(bash,zsh,csh)

echo "export PATH="'$PATH:$(brew --prefix)/bin' >> ~/.$(basename $SHELL)rc

請享用 !


0
2018-05-23 17:29