web-dev-qa-db-ja.com

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

そして、何らかの理由で、どのファイルを編集しても、変数は常に次のようになります(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変数をどこで定義できるのだろうと思っていましたか?

7
user1617942

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に新しいディレクトリがまだない場合にのみ追加します。

7
terdon

構成にランダム性のハリケーンを適用しました!

/etcのファイルの編集を取り消せない場合は、bashを再インストールする必要があります。

/etcのファイルを変更せずに、個人のPATHを調整できます。たとえば、 これらの回答 と読みます。もちろん、私は自分の答えを好みます。

man bashman lessを読み、man bashINVOCATIONセクションに目を向けることで、どこに迷っているのかを正確に判断できます。スタートアップファイルでlessを使用します。制御を転送するように見える場合(source.)、less!コマンドを使用してそのファイルを読み取ります。 less/コマンドを使用して、文字列PATH=を検索し、各ファイルでPATH割り当てを見つけます。 bashと同じくらい愚かであることを忘れないでください。

.bashrcと「別のユーザー」の起動ファイル(.profile.bash_login$HOME)を(diffで)比較できます。

4
waltinator

$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を設定しているスクリプト/ファイルの名前を返します。

1