web-dev-qa-db-ja.com

$ PATHは重複でいっぱいです

最近、開発用にOSX10.7環境の構成を開始しました。 HomeBrewをインストールし、.bash_profileに以下を追加しました。

export PATH="/usr/local/bin:/usr/local/sbin:~/bin:$PATH"        

echo $PATH次の重複文字列を取得した場合を除いて、すべてが正常に機能しています。/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:/usr/local/git/bin:/usr/local/git/bin:/usr/local/git/bin:/usr/local/git/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

読みやすくするために、これらはすべてパスです。

/usr/local/bin
/usr/local/sbin
~/bin:/usr/local/bin
/usr/local/sbin
~/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
/usr/local/git/bin
/usr/local/git/bin
/usr/local/git/bin
/usr/local/git/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
/usr/X11/bin

.bash_profileの1行以外にパスに変更を加えたとは思いません。それらの重複をペアリングするための最良の方法は何ですか?パスを変更しているファイルを探し出し、それらを排除しようとする方法はありますか?

6
Nick Tomlin

私のコメントをしたので、とにかく$PATHを剪定するためのいくつかの提案があります。

パスを見ると、.bash_profileが2回実行されているか、.bash_profileで行われた変更が他の場所で複製されているようです。

'/ usr/local/git/bin'と 'use/local/bin' [sic]の7つの重複した追加があり、その後に '/ usr/local/git/bin'の5つのコピーが続きます。 gitのインストール方法によっては、gitでインストールされたファイルについてパッケージマネージャーに問い合わせることができる場合があります。 PATHに影響を与えるいくつかの構成ファイルまたは変更されたシステムファイルが存在する可能性があります。

set -x.bash_loginの一番上に置き、新しいログインシェルを開始します。起動時にbashが何をしているかを正確に示す多くの出力が得られるはずです。これは、PATHがどこで変更されているかを把握するのに役立ちます。 set -xを理解したり、あきらめたりしたら、削除できます。何も見つからない場合は、それを/etc/profileの先頭に追加して、独自の.bash_profileが処理される前にシステムが実行することを追跡することもできます。

6
chepner

コマンドラインから Ryan Thompsonのスクリプト を実行しました。
順序を変更せず、末尾に:を残さずに、すべての重複を削除しました

PATH="$(Perl -e 'print join(":", grep { not $seen{$_}++ } split(/:/, $ENV{PATH}))')"

上記の便利な1ライナーに加えて、ライアンはconfigで使用する(より構造化された)スクリプトを共有して、他の変数PATHを重複排除します。

詳細については彼のUnixとLinuxの投稿を参照してください

6
SherylHohman

これを$ HOME/.bashrcに追加して(必要に応じて、代わりに.bash_profileに追加することもできます)、$ PATHから重複するエントリを削除しました。私はLinuxでのみテストしましたが、Macでも動作するはずです。最初のエクスポートPATHの後に追加する必要があります。

export PATH=$(echo $PATH | awk -F: '
{ for (i = 1; i <= NF; i++) arr[$i]; }
END { for (i in arr) printf "%s:" , i; printf "\n"; } ')
3
rasch

gitをインストールすると、深刻な事前チェックなしで.bash_profileが変更されました。このインストーラーはそれを破壊しました(明らかに12回)。 rash によって提案されたレシピを使用しますが、.bash_profileに含める正しい最小パスを定義するには1回だけです。

.bashrcでPATHを初期化する必要はありません。この初期化スクリプトは、シェルの各レベルで変更する必要がある構成用に予約されています。たとえば、プロンプト、位置、色などですが、PATHは変更しません。

0
dan