Hombrew でインストールされたツールが検出されるように、Mac で PATH 変数を設定するにはどうすればよいでしょうか?

Hombrew でインストールされたツールが検出されるように、Mac で PATH 変数を設定するにはどうすればよいでしょうか?

セットアップしようとしています自家製新しい 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

この回答は時代遅れです。Homebrew の推奨PATH順序は、以前は説明どおりでしたが、これはもう当てはまりません。ただし、このアプローチはより一般的に適用可能なので、興味のためにそのまま残しておきます。


そんなことはしないほうがいいよ。

Homebrewは意図的に/usr/local/bin /usr/binPATH最大限の互換性のために、パスにこれらのディレクトリの順序を逆にすると/etc/paths全てシステム上のどこにあるプログラムでも、どのように起動されたかに関係なく、Homebrew バージョンのコマンドが取得されます。ただし、Apple のバージョンを特に期待している場合や、新しいバージョンを使用できない場合もあります。

この原則を維持しながら、Homebrew でインストールされたバージョンの を入手するにはどうすればよいでしょうgitか。諺にあるように、すべての問題は間接層で解決できます (間接層が多すぎる場合を除く)。 — または、この場合は、結局のところ 2 つの層になります。

~/bin具体的には、私の Unix の習慣として、 の先頭にディレクトリを置くことになっていますPATH。これは、私の の最初の部分です.bashrc

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

これPATHは が含まれているかどうかを確認し~/bin、含まれていない場合はそれを先頭に追加します。これを設定すると、Homebrew管理のものだけをgitシステムバージョンよりも優先するように選択できます(Homebrew管理バイナリ)とシェルセッションのみ(全て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 での設定方法であり、これまではうまく機能していましたが、結果は人によって異なります。

/usr/local/bin彼らはそれがうまくいくと信じているようだ /usr/binなので、私自身が台無しにしてしまったかもしれませんが$PATH、彼らのドキュメントが欠けているところはわかります。

一部のプログラムは、たとえば ruby​​ のシステム バージョンを取得することを期待しており、新しい Homebrew バージョンを取得すると動作が中断されるため、/usr/local/bin後に置く必要があることに注意してください。/usr/bin

からwiki と brew doctor の不一致 #10738/usr/local/binこのドキュメントには、「FAQ (上記の引用) は GUI アプリの PATH 設定について言及しており、ドクター (PATH の先頭に配置するアドバイス/usr/bin ) は CLI アプリの PATH 設定について言及しています」と記載されていることに注意してください。

答え4

私の理解では、は Apple の配布実行ファイルと衝突する (同じ名前を持つ)brewものは何も入れません。したがって、と の前のパスに があっても、名前の衝突は発生しないはずなので、問題にはなりません。 *ただし、との問題、およびや(MacPorts)などの他のパッケージ アグリゲータの使用に関する問題については、下記を参照してください。/usr/local/bin/usr/local/bin/bin/usr/binlstarfinkport

Brew名前の衝突を管理するのに役立つ、私が知っている 2 つの方法のうちの 1 つを実行します。

  1. Brewリンクされていない樽をセラーに残します。 インストールを行うために、brew はツールをそのままにして、 内のそれらのツールへのシンボリック リンクを作成します/usr/local/bin。 と名前が衝突することを望まないツールの場合brew、シンボリック リンクは作成されません。
  2. および にも含まれる標準ツールの多く(すべてではないにしても/bin)では/usr/binbrewのリンクの先頭に/usr/local/bin「g」が付けられます。そのため、たとえば、lsbrew バージョンで を実行するには、 を使用しますgls 単に を実行しls -l/usr/local/bin、リンクされたファイルを探します。それらがbrewそこに配置されているファイルです。注:brew実際の名でアクセスする必要があるインストール済みツールは にあります/usr/local/Cellar/coreutils/8.21/libexec/gnubin

私が自分の道を進まない/usr/local/binのには 2 つの理由があります。その理由は私の回答の最後にあります。

システム内の名前の衝突を評価するには、 を使用し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、他のものとうまく連携しないからです。そしてfinkport(MacPorts)は現在、私が必要とするよりもはるかに多くのパッケージをサポートしています。たとえば、gnome-terminalを使って を取得できますfinkが、数式を作成して を使って同じことを行うのは大変な作業です。そこで、と を検索に含めてbrew保持し(それぞれとに対して)、 から必要なもの( を含む)をスペルアウトするか、 を使用するか、コードを書くときにまったく異なる環境のファイルをソースとして参照します。/sw/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

関連情報