Wo wird meine PATH-Variable gesetzt?

7

Ich versuche, meine Pfadvariable so einzustellen, dass sie folgendermaßen aussieht:

/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

Und aus bestimmten Gründen sieht die Variable, egal welche Datei ich bearbeite, immer so aus (wobei sich der Java-Pfad einige Male wiederholt):

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

Ich habe meine persönliche bearbeiten versucht .bashrcund .profilesowie /etc/environment, /etc/bash.bashrc, /etc/profileund stellen Sie sie in /etc/profile.d. Nun gibt es jdk.shin /etc/profile.ddem der PATH - Variable ist identisch mit dem falschen, dem ich oben gepostet. Ich habe jedoch versucht, die Zeile zu kommentieren und sogar jdk.shganz zu entfernen, und das hat es immer noch nicht behoben.

Ansonsten ist mir aufgefallen, dass ich, wenn ich mich als anderer Benutzer anmelde, die richtige PATH-Variable habe und die durcheinandergebrachte nicht, da Java einige Male wiederholt wird.

Ich habe mich also gefragt, wo sonst meine PATH-Variable definiert werden könnte, die ich noch nicht überprüft habe.

user1617942
quelle
Haben Ihr .bash_profile (oder .profile) und / oder Ihre .bashrc-Quelle andere Dateien?
Glenn Jackman
Nein, weder mein .profile noch mein .bashrc beziehen andere Dateien.
user1617942
Es ist komisch: Dateien in /etc/profile.d werden für jede Login-Bash-Sitzung bezogen. Ihr anderer Benutzer sollte diese also auch haben. Warum setzen Sie Ihren "richtigen" Pfad nicht einfach explizit in Ihr .profile?
Glenn Jackman
Ja, das habe ich gerade gemacht, was funktioniert hat. Ich bin immer noch interessiert zu sehen, was die anderen Dateien überschrieben hat (bash.bashrc, / etc / profile usw.).
user1617942
Es sieht so aus, als hättest du jdk/bin:jgrande/binam Anfang und jdk/jre/binam Ende beides zweimal passiert. Ich weiß nicht, was "jgrande" ist, aber es sieht verdächtig aus. Ich würde danach in /etc/profile.d suchen
Glenn Jackman

Antworten:

7

Der PATH kann in jeder der verschiedenen Dateien festgelegt werden, die Bash Reads beim Start ausführen. Führen Sie Folgendes aus, um alle zu finden:

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

Das sind die Standard. Wenn Sie auch andere Dateien aus einer dieser Dateien beziehen, können die Dinge komplexer werden.

Um das Problem zu beheben - vorausgesetzt, Sie haben nichts mit den globalen Dateien in getan - können Sie /etc/Folgendes ausführen:

sed -i '/PATH=/d' ~/.bashrc ~/.profile ~/.bash_profile ~/bash.login ~/.bash_aliases 

Dadurch werden alle Zeileneinstellungen PATHaus diesen Dateien gelöscht . Fügen Sie nun die richtige an der richtigen Stelle hinzu:

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

Wenn Bash als Login-Shell aufgerufen wird, liest es, .bash_profilefalls vorhanden, und wenn nicht, liest es ~/.profile(es wird ignoriert, .profilewenn .bash_logines vorhanden ist, aber ich gehe davon aus, dass es nicht vorhanden ist). Die obigen Befehle speichern also zuerst Ihren gewünschten Pfad als $ppund prüfen dann, ob ein ~/.bash_profilevorhanden ist. Fügen Sie die Pfaddefinition hinzu, falls dies der Fall ist, und fügen Sie sie hinzu, falls dies nicht der Fall ist ~/.profile.

Um diese Art von Problemen in Zukunft zu vermeiden, verwenden Sie eine Funktion, um Verzeichnisse zu Ihren hinzuzufügen $PATH. Fügen Sie diese Zeilen zu Ihrem hinzu ~/.profile:

pathmunge () 
{ 
    if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)"; then
        if [ "$2" = "after" ]; then
            PATH=$PATH:$1;
        else
            PATH=$1:$PATH;
        fi;
    fi
}

Um dann etwas an den Anfang von $PATHhinzuzufügen, fügen Sie diese Zeile hinzu zu ~/.profile:

pathmunge "/path/to/foo"

Und um es am Ende hinzuzufügen:

pathmunge "/path/to/foo" after

Die Funktion fügt dem nur dann ein neues Verzeichnis hinzu, $PATHwenn es noch nicht vorhanden ist.

Terdon
quelle
4

Sie haben einen Hurrikan der Zufälligkeit auf Ihre Konfigurationen angewendet!

Wenn Sie Ihre Änderungen an den Dateien in nicht rückgängig machen können /etc, müssen Sie sie möglicherweise neu installieren bash!

Sie können Ihre persönlichen Einstellungen anpassen, PATHohne Dateien zu ändern /etc. Lesen Sie zum Beispiel diese Antworten . Ich bevorzuge natürlich meine Antwort.

Sie könnten genau bestimmen , wo Sie in die Irre gehen werden durch das Lesen man bash, man lessund mit einem Auge auf den INVOCATIONAbschnitt man bash, den Einsatz lessauf den Startdateien. Wenn sie die Kontrolle ( source, .) zu übertragen scheinen , verwenden Sie lessden !Befehl ', um diese Datei zu lesen. Verwenden Sie lessden /Befehl 's , um nach der Zeichenfolge PATH=zu suchen und PATHZuweisungen in jeder Datei zu finden . Denken Sie daran, so dumm zu sein wie bash.

Sie könnten vergleichen (mit diff) die Startdateien ( .bashrc, .profile, .bash_login) zwischen Ihrem $HOMEund der „anderen Benutzer“.

Walzer
quelle
2

$PATHVerwenden Sie Folgendes, um alle Stellen zu finden, an denen Umgebungsvariablen geändert werden:

sudo grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e "PATH="

Dadurch werden alle Verzeichnisse auf Ihrem System mit Ausnahme der Verzeichnisse des virtuellen Dateisystems durchsucht. In meinem Fall werden mit drei gemounteten Distributionen 697 Dateien zurückgegeben.


Ein gezielterer Ansatz für OP ist die Suche nach einem bestimmten Pfadnamen. Sie könnten nach dem Programm suchen, das den ungewöhnlichen Teil von $ PATH festlegt, der Folgendes enthält:

/usr/local/java/jdk1.7.0_79/bin

Führen Sie dies im Terminal aus:

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"

Wenn das erste Verzeichnis im $ PATH nicht der Schuldige ist, suchen Sie nach dem letzten:

/usr/lib/jvm/java-7-openjdk-amd64/jre/bin

grep gibt den Namen des Skripts / der Datei zurück, die $ PATH setzt.

WinEunuuchs2Unix
quelle
Du bist ein Lebensretter! Jemand hat den Pfad in xinitrc von xfce4 geändert ... Ich glaube nicht, dass ich das ohne dein grep gefunden hätte!
WLigtenberg