パス変数を次のように設定しようとしています:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/jgrande/Android-sdk-linux/platform-tools:/usr/lib/jvm/Java-7-openjdk-AMD64/bin/:/usr/lib/jvm/Java-7-openjdk-AMD64/jre/bin
そして、何らかの理由で、どのファイルを編集しても、変数は常に次のようになります(Javaパスが何度も繰り返されます):
PATH=/usr/local/Java/jdk1.7.0_79/bin:/home/jgrande/bin:/usr/local/Java/jdk1.7.0_79/bin:/home/jgrande/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/Java/jdk1.7.0_79/bin:/usr/local/Java/jdk1.7.0_79/jre/bin:/usr/local/Java/jdk1.7.0_79/bin:/usr/local/Java/jdk1.7.0_79/jre/bin
個人の.bashrc
と.profile
に加えて/etc/environment
、/etc/bash.bashrc
、/etc/profile
を編集し、/etc/profile.d
に設定しようとしました。さて、jdk.sh
には/etc/profile.d
があり、PATH変数は上記で間違ったものと同じです。しかし、その行をコメントアウトし、jdk.sh
を完全に削除しようとしても、それでも修正されませんでした。
それ以外の場合、別のユーザーとしてログインすると、正しいPATH変数があり、Javaが何度も繰り返されるという混乱した変数はありません。
だから、まだチェックしていないPATH変数をどこで定義できるのだろうと思っていましたか?
PATHは、bashの起動時に読み取るさまざまなファイルのいずれかに設定できます。それらをすべて見つけるには、これを実行します:
grep --color -H 'PATH=' ~/.bashrc ~/.profile ~/.bash_profile ~/bash.login \
~/.bash_aliases /etc/bash.bashrc /etc/profile \
/etc/profile.d/* /etc/environment 2> /dev/null
これらは標準のものです。それらの1つから他のファイルも調達している場合、事態はより複雑になる可能性があります。
とにかく、それを修正するには、/etc/
のグローバルファイルに何もしていないと仮定して、これを実行できます。
sed -i '/PATH=/d' ~/.bashrc ~/.profile ~/.bash_profile ~/bash.login ~/.bash_aliases
これらのファイルからPATH
を設定している行を削除します。次に、適切な場所に適切なものを追加します。
pp='PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/jgrande/Android-sdk-linux/platform-tools:/usr/lib/jvm/Java-7-openjdk-AMD64/bin/:/usr/lib/jvm/Java-7-openjdk-AMD64/jre/bin'
[[ -e '~/.bash_profile' ]] && echo "$pp" >> ~/bash_profile ||
echo "$pp" >> ~/.profile
ログインシェルとして呼び出された場合、bashは.bash_profile
を読み取り、存在しない場合は~/.profile
を読み取ります(.profile
が存在する場合は.bash_login
を無視しますが、存在しないと想定します't)。したがって、上記のコマンドは最初に目的のパスを$pp
として保存し、次に~/.bash_profile
が存在するかどうかを確認し、存在する場合はパス定義を追加し、存在しない場合は追加します~/.profile
に。
将来、この種の問題を回避するには、関数を使用して$PATH
にディレクトリを追加します。これらの行を~/.profile
に追加します。
pathmunge ()
{
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)"; then
if [ "$2" = "after" ]; then
PATH=$PATH:$1;
else
PATH=$1:$PATH;
fi;
fi
}
次に、$PATH
の先頭に何かを追加するには、この行を~/.profile
に追加します。
pathmunge "/path/to/foo"
最後に追加するには:
pathmunge "/path/to/foo" after
この関数は、$PATH
に新しいディレクトリがまだない場合にのみ追加します。
構成にランダム性のハリケーンを適用しました!
/etc
のファイルの編集を取り消せない場合は、bash
を再インストールする必要があります。
/etc
のファイルを変更せずに、個人のPATH
を調整できます。たとえば、 これらの回答 と読みます。もちろん、私は自分の答えを好みます。
man bash
、man less
を読み、man bash
のINVOCATION
セクションに目を向けることで、どこに迷っているのかを正確に判断できます。スタートアップファイルでless
を使用します。制御を転送するように見える場合(source
、.
)、less
の!
コマンドを使用してそのファイルを読み取ります。 less
の/
コマンドを使用して、文字列PATH=
を検索し、各ファイルでPATH
割り当てを見つけます。 bash
と同じくらい愚かであることを忘れないでください。
.bashrc
と「別のユーザー」の起動ファイル(.profile
、.bash_login
、$HOME
)を(diff
で)比較できます。
$PATH
環境変数が変更されているすべての場所を見つけるには、これを使用します。
Sudo grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e "PATH="
これにより、仮想ファイルシステムディレクトリを除くシステム上のすべてのディレクトリが検索されます。 3つのディストリビューションがマウントされている私の場合、697個のファイルが返されます。
OPのよりターゲットを絞ったアプローチは、特定のパス名を検索することです。次を含む$ PATHの異常な部分を設定しているプログラムを探すことができます。
/usr/local/Java/jdk1.7.0_79/bin
ターミナルでこれを実行します:
Sudo grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e "/usr/local/Java/jdk1.7.0_79/bin"
$ PATHの最初のディレクトリが原因ではない場合、最後のディレクトリを検索します。
/usr/lib/jvm/Java-7-openjdk-AMD64/jre/bin
grep
は、$ PATHを設定しているスクリプト/ファイルの名前を返します。