2011-08-17 19:36:41 +0000 2011-08-17 19:36:41 +0000
86
86
Advertisement

Hombrewにインストールされているツールが見つかるように、MacのPATH変数を設定するにはどうすればいいですか?

Advertisement

新しいMacで Homebrew を設定しようとしています(以前のMacではソースからパッケージをインストールしていました)。

最初にインストールしようとしたパッケージはGitでした。

$ brew install git

インストールはうまくいったのですが、which gitにはまだLion(だったかな?)と一緒についてきた/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 より前のものが表示されているので、混乱してしまいました! 私はHomeBrewのポイントは(制作者が自慢しているように見えるもの)、変数$PATHをいじらなくてもいいということだと思っていました!

それで、私は何か間違ったことをしたのでしょうか?

Advertisement
Advertisement

回答 (9)

79
79
79
2013-01-13 22:35:02 +0000

この関連記事が非常に参考になりました。$PATH変数を変更するのではなく、単に/etc/pathsファイルを編集するだけです。 Homebrew wants to amend me to my PATH; no clue how

指示に従って/usr/local/bin/usr/binの上に置くとすぐに問題は解決しました。

1.OS Xでターミナルを開く 2. コマンドを入力。sudo vi /etc/paths 3. パスワードを聞かれたら入力 4. パスのリストが表示されます。/usr/local/binパスが/usr/binパスの上に入力されるように編集します 5. *¶*Save and quit 6. ターミナルを再起動する

これをやった後の私のはこんな感じ。

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

*コロン(:)を入力してから、wq(書き込みと終了を同時に行うため)と入力し、Enterを押します。

グラフィカル・テキスト・エディタで/etc/pathsファイルを開いて編集することもできます。

彼の回答は Stack Overflow の fengd over に感謝します。

29
29
29
2013-04-09 23:28:21 +0000

この答えは時代遅れです。好ましい Homebrew PATH の順序は、以前は説明した通りでしたが、それはもはや真実ではありません。しかし、このアプローチはより一般的に適用可能なので、興味を持ってもらうために、このままにしておきます。


やめた方がいいですよ。

Homebrew は、互換性を最大限に高めるために、意図的に /usr/local/bin after /usr/bin をパスに入れています。PATHを編集して/etc/pathsのディレクトリの順番を逆にすると、システム上のあらゆる場所にあるすべてのプログラムが、どのように起動されたかに関わらず、コマンドのHomebrewバージョンを取得することになります。しかし、中にはAppleのバージョンを特別に期待している人や、単に新しいバージョンが使えないだけの人もいるかもしれません。

この原則を守りつつ、Homebrewがインストールされたバージョンのgitを取得するにはどうしたらいいのでしょうか?諺にもあるように、すべての問題は間接的なレイヤーで解決することができます(間接的なレイヤーが多すぎる場合を除く)。- この場合、2つのレイヤーが必要になります。

具体的には、~/binのディレクトリをPATHの先頭に置くのが私のUnixの習慣の一部になっています。これは私の.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にディレクトリを追加してシンボリックリンクすることで、問題が解決して、ドクター・セウスの笑顔が見られるようになります。Yo dawg 私はあなたがシンボリックリンクが好きだと聞いたので、私たちはあなたのPATHにパスを入れて、シンボリックリンクをしながらシンボリックリンクができるようにしました。

18
Advertisement
18
18
2011-08-17 19:42:55 +0000
Advertisement

あなたは何も間違ったことをしていませんが、/usr/local/bin の前に /usr/bin をパスに入れておけば、この特定の問題は解決すると思われます。最も簡単な方法は、~/.bash_profile

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

のようなものを入れて、Homebrewがインストールするすべてのものが最初に見つかるようにすることです。これが私のMacでの設定方法で、これまでの間はうまくいっていましたが、YMMVです。

彼らは /usr/local/binafter /usr/bin であれば動作すると信じているようです。

$PATHの後に/usr/local/binを付けるべきであることに注意してください。なぜなら、いくつかのプログラムは、例えばrubyのシステムバージョンを取得することを期待していて、新しいHomebrewバージョンを取得すると壊れてしまうからです。

From Discrepancy between wiki & brew doctor #10738 .  この文書では、"The FAQ (上記の引用)はGUIアプリのPATH設定を参照しています; the doctor (/usr/binをPATHに/usr/local/binの前に置くアドバイス)はCLIアプリのPATH設定を参照しています “と続いていることに注意してください。

6
6
6
2013-04-03 19:28:03 +0000

私は jthomas の答えに同意しません。etc/paths ファイルを編集すると、すべてのプログラムのロードパスが変更されます。これは、システムアプリケーションがバイナリの特定のバージョンを見つけることを期待しているのに、あなたがパスファイルを編集したために異なるバージョンを見つけた場合に危険です。代わりに、~/.bashrc (または ~/.bash_profile) のパス変数を変更してください。そうすれば、ロードパスはターミナル内でのみ変更されます。

Add homebrew app to PATH

export PATH=/path/to/homeebrew/app/bin:$PATH

その後、bash をリロードするか、source ~/.bashrc を実行すれば完了です。homebrewのパスは何よりも先に来るので、bashはhomebrewでダウンロードしたバージョンをロードします。

5
Advertisement
5
5
2014-01-03 22:07:43 +0000
Advertisement

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

port は、名前の衝突を管理するのに役立つ、私が知っている2つのことのうちの1つを行います。

  1. **Brewは、リンクされていない樽をセラーに残します。Brewが名前の衝突を望まないツールについては、シンボリックリンクは作成されません。
  2. **/usr/local/binbrewに含まれている標準ツールの多くは、/binのリンクの前に “g "を付けているため、例えばBrewバージョンで/usr/binを実行するにはbrewを使用します。注意: 実名でアクセスしなければならない/usr/local/binのインストールされたツールは、lsの中にあります。

私が gls をパスに入れないのには、2つの理由があります。

お使いのシステムでの名前の衝突を評価するには、ls -l を使用してこのセクションを探してください - ここには、興味のある /usr/local/bin の出力があります。

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/usr/local/Cellar/coreutils/8.21/libexec/gnubinコマンドがファイルシステムのACLを適切に処理していないからで、実際、私が最後にチェックした時(これは先週だった)には、全く処理されていませんでした。これは大きな問題であり、/usr/local/binを正しく設定することに伴う関連するbrew doctorページ設定の問題と一緒に、これを完全に回避するために、私はbrew doctor関連ツール、特にbrewbrewにあるものを最初に置くようにしています。

ls をパスに入れないもう一つの理由は、tar が他のものとの相性が良くないことと、man$PATH (MacPorts) には、私が NOW を必要としているサポートされているパッケージの数がはるかに多いからです。例えば、OSX/binを得ることはできますが、/usr/binで同じことをするには計算式を構築するのが大変な労力になります。そこで、私は/usr/local/binbrewを検索finkに入れておいて(それぞれportgnome-terminalのために)、finkを含めてbrewから必要なものを参照しているのですが、/swのコードを書くときには、/optのものを綴ったり、$PATHのものを使ったり、全く別の環境用のfinkファイルをソースにしたりしています。

問題なのは、その時に何が必要で何をしたいのか、何が必要なのかにかかっているということです。

上に書いたACLの問題の例です。

標準のportツールを使用した場合:

$ /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

/usr/local/binインストールされたツールを使用した場合:

$ /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

あなたはgnatでも同じような結果を得ることができます。

4
4
4
2014-09-18 20:46:55 +0000

ここにはたくさんの良い答えがある ここでは私の回答を紹介します。

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

0x1&

プログラムごとに個別のエイリアスを作成する手間が省けます。

ZSH を使用している場合も同様に動作します。bashrczshrc に置き換えることもできますし、my_ に置き換えることもできます。

2
Advertisement
2
2
2013-07-30 18:47:40 +0000
Advertisement

PATH をいじらずに (これまでの私の歴史の中では、数ヶ月後に私を焦がしてしまいます)、zsh のカスタム aliases ディレクトリ (~/.zshrc/custom/git_alias.zsh) に git 用のエイリアスを追加しました。

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

0
0
0
2017-05-23 17:29:13 +0000

ターミナルで以下のコマンドを実行すると、Brewのホームディレクトリと、お使いのSHELLのrcのinitファイル(bash, zsh, csh)のPATHにある/binが追加されます。

0
Advertisement
0
0
2014-03-21 11:54:36 +0000
Advertisement

私は、$PATH のような環境変数の変更を、実際に変更を望むユーザに限定したいと考えています。そのため、単に ~/.bashrc に以下のように追加しています。

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

関連する質問

19
12
5
13
31
Advertisement