web-dev-qa-db-ja.com

$ PATHは私を狂わせています

OK、これが馬鹿げたことならお詫びしますが、私はアイデアが不足しています。

目標: _/usr/local/bin_を_$PATH_の前に追加

問題: _$PATH_は私が望むまたは期待することをしません

どうやってここに来たのか:プログラミングを学び始めたいので、ボンネットの下をいじり回すのは快適ですが、あまり経験がありません。 fishを使用してhomebrewシェルをインストールし(わかりやすいため!)、デフォルトのシェルとして設定しました(_system prefs>users & groups>advanced_の下)。ある時点で、_brew doctor_を実行して、インストールがすべてコーシャであるかどうかを確認しました。_/usr/local/bin_を_$PATH_の前に移動して、gitのインストールを使用できるようにすることを提案しました。システムコピー。結構ですが、_path_helper_とfishの間で、_$PATH_に何かが起こっていて、制御できず、パスを正しい方法で配置できませんでした。

環境: OSX 10.8.2、10.7ishからアップグレード、xcodeとdevtoolsがインストールされ、さらに_x11_、homebrew、およびfish

詳細:ユーザーのデフォルトのシェルをbashに戻し、_terminal.app_ --bashfishshを介してさまざまなシェルを試しました。 _/usr/local/bin_を_/etc/paths_の先頭に移動しましたが、何も変更されませんでした。さまざまな_config.fish_ファイルを調べて、$ PATHを混乱させる可能性のあるものをコメントアウトしましたが、役に立ちませんでした。 _/etc/paths.d/_に次のファイルがあります。

_./10-homebrew_を含む_/usr/local/bin_

_./20-fish_を含む_/usr/local/Cellar/fish/1.23.1/bin_

_./40-XQuartz_を含む_/opt/X11/bin_

profileに_set +x_を追加し、_terminal.app_を起動すると次のようになります。

_Last login: Mon Oct  1 13:31:06 on ttys000
+ '[' -x /usr/libexec/path_helper ']'
+ eval '/usr/libexec/path_helper -s'
++ /usr/libexec/path_helper -s PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/Cellar/fish/1.23.1/bin:/opt/X11/bin";
export PATH;
+ '[' /bin/bash '!=' no ']'
+ '[' -r /etc/bashrc ']'
+ . /etc/bashrc
++ '[' -z '\s-\v\$ ' ']'
++ PS1='\h:\W \u\$ '
++ shopt -s checkwinsize
++ '[' Apple_Terminal == Apple_Terminal ']'
++ '[' -z '' ']'
++ Prompt_COMMAND='update_terminal_cwd; '
++ update_terminal_cwd
++ local 'SEARCH= '
++ local REPLACE=%20
++ local PWD_URL=file://Chriss-iMac.local/Users/c4
++ printf '\e]7;%s\a' file://Chriss-iMac.local/Users/c4 
Chriss-iMac:~ c4$
_

したがって、path_helperが実行されているように見えますが、_echo $PATH_を実行すると_/usr/bin:/bin:/usr/sbin:/sbin_になります。それで、_path_helper_はもう想定されていることをしていないように見えますか?

ここには、私が理解していない明確に定義された動作があるか、修正しようとしているときに何かを中断したと確信しています。助けてください!

10
Chris4d

回答してくれたAaronと、stackexchangeサイトで他の同様の質問に答えてくれたすべての人に感謝します。後世のために、これが私が理解したことです:

  1. path_helperは、構文/etc/profile(アポストロフィは実際にはバッククォートです)によってeval '/usr/libexec/path_helper -s'から呼び出されます。ダミーのように、バックティックがどのように機能するかわからなかったので、何らかの理由でバックティックを引用符に変更しました。これにより、profilepath_helperの読み込みから壊れました。バックティックを交換すると、(もちろん)正常に機能するようになりました。
  2. set PATH /usr/local/bin $PATH~/.config/fish/profile.fishを使用すると、優先シェルで正しい順序を取得できますが、path_helperが機能する限り、冗長になる可能性があります。
  3. 完全な$PATHをスクリプトやGUIアプリなどで利用できるようにするために、launchd.confenvironment.plist...の間でまだ調査中のトスアップのようです。
3
Chris4d

解決策:

システム全体の設定またはユーザー構成のどちらが必要かを選択し、適切な構成ファイルを編集します。fishではpath_helperを使用しないでください。

もっと

fishは/ etc/profileをソースしません。システム全体とユーザー構成の場合、それぞれ/etc/fish/config.fishと〜/ .config/fish /config.fishを読み取ります[1]。

path_helperは、システム全体のプロファイルファイル(sh、csh、およびそれらの派生物)をソースとするシェルに使用するためのものです。 10.7path_helperは/ etc/pathの順序を尊重しているように見えるので、AFAIRは10.6ではそうではなく、対処するのが困難でした。

本当に魚でpath_helperを使用したい場合は、出力を解析する必要があります。これは、-sおよびでshおよびcsh構文のみを提供するためです。 -cオプション。

何かのようなもの

/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g'

仕事をする必要があります:

[1] http://ridiculousfish.com/Shell/user_doc/html/index.html#initialization

5
anddam

/etc/paths.d、path_helper、&c。についてはまったくわかりません。これらはすべて、私には過度の複雑さのように見えますが、〜/ .bashrcの最後にある次の内容で正しく理解できます。

 PATH=/usr/local/bin:$PATH

お役に立てれば!

3
Aaron Miller