web-dev-qa-db-ja.com

自作インストールのツールが見つかるように、どうすれば私のMac上でPATH変数を設定するべきですか?

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

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

$ brew install git

インストールは問題ありませんでしたが、which git Lion に付随する/usr/bin/git内のものをまだ示しています(私は思いますか?)そして、インストールされたばかりの/usr/local/bin/gitのものではありません。

$ echo $PATH
/Users/meltemi/.rvm/gems/[email protected]/bin:/Users/meltemi/.rvm/gems/[email protected]/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変数をいじる必要がないということです!

それで、私は何を間違っていましたか?

84
Meltemi

私はこの関連記事がとても参考になったことがわかりました。 $PATH変数を変更する代わりに、単に/etc/pathsファイルを編集するだけです。

自作は私に私の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で fengd overへの功績。

76
jthomas

この答えは時代遅れです。優先されるHomebrewのPATHの順序は説明されている通りでしたが、それはもはや真実ではありません。ただし、このアプローチはより一般的に適用可能であるため、興味を引くように、ここでは取り上げません。


しないでください。

最大限の互換性を保つために、Homebrewは意図的に/usr/local/bin/usr/binの後に置きます。 /etc/pathsを編集してPATH内のこれらのディレクトリの順序を逆にすると、システム上のどこにいても、allprogramsは、Homebrewバージョンのコマンドになります。 。しかし、Appleのバージョンを明確に期待している人もいれば、新しいバージョンを使用できない人もいます。

どうやってこの原則を守り、それでもHomebrewがインストールしたgitのバージョンを入手するにはどうすればいいですか?言うように、すべての問題は間接層で解決することができます(間接層が多すぎることを除く)。 - あるいは、この場合、実は2層です。

特に、私のPATHの始めに置く~/binディレクトリを持つのは、私のUnix習慣の一部でした。これは私の.bashrcの最初のビットの一つです:

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

これはPATH~/binが含まれているかどうかをチェックし、含まれていない場合はそれを先頭に追加します。それが整っていれば、(everyHomebrew-managed binaryの代わりに)Homebrew管理のgitのみを選択的にシステムバージョンより優先させることができます。 (GUIプログラムを含む、どこからでも起動するallプログラムではなく)シンボリックリンクと同じくらい簡単です。

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

symlink /usr/local/Cellar/git/1.8.2.1/bin/gitに直接リンクできますが、brew upgrade gitを実行するたびに(直接または間接的に)シンボリックリンクを修正する必要があります。 Homebrewの固定位置のシンボリックリンクにシンボリックリンクすることで、心配する必要はありません。

それであなたはあなたの$HOMEにディレクトリを追加しますので、あなたはそれをあなたのPATHに追加することができます。それであなたはシンボリックリンクにシンボリックリンクすることができます。あなたはシンボリックリンクが好きなので、私たちはあなたのシンボリックリンク中にシンボリックリンクできるようにあなたのPATHにパスを入れます。

29

間違ったことは何もしていませんが、/usr/local/binの前に/usr/binがパスにあった場合、この特定の問題はなくなるでしょう。最も簡単な修正方法は、それを実行して、次のようなものを置くことです

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

~/.bash_profileにあるため、Homebrewがインストールするすべてのものが最初に見つかります。それが私のMacでの設定方法であり、YMMVでこの長い間機能していました。

/usr/local/binafter/usr/binであることで動作すると信じているようです。 $PATH、ドキュメントが欠けている箇所を確認できます。

/usr/local/binの後に/usr/binを配置する必要があることに注意してください。一部のプログラムは、Rubyなどのシステムバージョンを取得し、新しいHomebrewバージョンを取得すると中断するためです。

wikiとbrew doctor#10738の間の相違 。このドキュメントでは、「FAQ(上記の引用)はGUIアプリのPATH設定を参照しています。医師(/usr/local/binをPATHで/usr/bin]に優先させることを参照) CLIアプリのPATH設定に。」

17
Nick Klauer

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

#PATHに自作アプリを追加する
export PATH =/path /から/ homebrew/app/binへ:$ PATH

それからbashかsource ~/.bashrcをリ​​ロードしてください。自作パスは他の何よりも先にくるので、bashはあなたが自作でダウンロードしたバージョンをロードします。

6
Nathan

私が理解しているように、brewはApple分散実行可能ファイルと衝突する(同じ名前を持つ)/usr/local/binに何も入れません。したがって、/usr/local/binおよび/binの前のパスに/usr/binを含めることは、名前の競合がないため問題になりません。 *ただし、lsおよびtarの問題、およびfinkおよびport(MacPorts)などの他のパッケージアグリゲーターの使用方法については、下記をご覧ください。

Brewは、名前の衝突の管理に役立つ、私が知っている2つのことのいずれかを行います。

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

2つの理由で/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が他のユーザーとうまく機能しないため、そしてfinkport( MacPorts)には、現在必要なサポートされているパッケージがかなりありますNOW例えば、finkgnome-terminalを取得できますが、式を作成してbrewでも同じことをするのは大変な努力です。したがって、/sw/optを検索に$PATH(それぞれfinkportの場合)を保持し、/usr/local/binから必要なものを参照します、gnatを含む、またはbashaliasを使用するか、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ツールを知らないが、ACLの問題のために6か月後に何かを壊す余裕がある人!

5
Billy McCloskey

ここにはたくさんの良い答えがあります。これが私のものです:

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を使用している場合も同じように機能します。 bashrczshrcに切り替えるだけです。あなたは_@のためにmyを無効にして入力を節約することができます。

4
Cheezmeister

PATHをいじるのではなく(私の歴史では数か月後に私を焼き払うために戻ってきました)、私のzshカスタムエイリアスディレクトリ(〜/ .zshrc/custom/git_alias.zsh)にgitのエイリアスを追加しました。

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

2
Jesse Smith

私は$PATHのような環境変数への変更を実際に変更したいユーザーに限定することを好みます。したがって、私は単に以下を~/.bashrcに追加します。

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

あなたは端末で以下のコマンドを発行することができます、それはあなたのどんなシェル "rc" initファイル(bash、zsh、csh)のパスにbrewホームディレクトリ+/binを追加するでしょう。

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

楽しい !

0
Vincent DAGOURY