Nach dem Starten eines Bash-Terminals habe ich festgestellt, dass die Variable PATH doppelte Einträge enthält. Mein Terminal startet eine Anmelde-Shell , wird also ~/.bash_profile
von ~/.profile
und gefolgt ~/.bashrc
. Nur in ~/.profile
erstelle ich die Pfade Einträge, die dupliziert werden.
Um pedantisch zu sein, ist dies die Reihenfolge, in der die zu beschaffenden Dateien beschafft werden:
Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc
Bevor jemand dies als Duplikat von "PATH-Variable enthält Duplikate" markiert, lesen Sie weiter.
Zuerst dachte ich, das hätte damit zu tun ~/.profile
, dass ich zweimal beschafft wurde, also musste ich die Datei jedes Mal, wenn sie beschafft wurde, in eine Protokolldatei schreiben, und überraschenderweise protokollierte sie nur einen Eintrag, was mir sagt, dass sie nur einmal beschafft wurde. Noch überraschender ist die Tatsache, dass, wenn ich die Einträge auskommentiere, die in waren ~/.profile
, die Einträge immer noch in der PATH
Variablen angezeigt werden. Dies hat mich zu drei Schlussfolgerungen geführt, von denen eine schnell ausgeschlossen wurde:
- Bash ignoriert gültige Bash-Kommentare und führt den kommentierten Code weiterhin aus
- Es gibt ein Skript, das den
~/.profile
Code liest und ignoriert, der eine Ausgabe druckt (z. B. die Protokolldatei). - Es gibt noch eine Kopie von mir
~/.profile
, die woanders bezogen wird
Das erste habe ich schnell festgestellt, dass es aufgrund einiger schneller Tests nicht der Fall ist. Bei der zweiten und dritten Option brauche ich Hilfe.
Wie sammle ich ein Protokoll von Skripten, die beim Start meines Terminals ausgeführt werden? Ich habe echo
in den von mir überprüften Dateien nachgeschlagen, ob sie von Bash stammen, aber ich muss eine schlüssige Methode finden, die die Ausführung bis zu dem Zeitpunkt nachzeichnet, an dem das Terminal für mich zum Eingeben bereit ist.
Wenn dies nicht möglich ist, kann jemand vorschlagen, wo ich sonst nachsehen kann, welche Skripte ausgeführt werden .
Zukunftsbezug
Dies ist das Skript, das ich jetzt verwende, um es meinem Pfad hinzuzufügen:
function add_to_path() {
for path in ${2//:/ }; do
if ! [[ "${!1}" =~ "${path%/}" ]]; then # ignore last /
new_path="$path:${!1#:}"
export "$1"="${new_path%:}" # remove trailing :
fi
done
}
Ich benutze es so:
add_to_path 'PATH' "/some/path/bin"
Das Skript prüft, ob der Pfad in der Variablen bereits vorhanden ist, bevor er vorangestellt wird.
Für zsh-Benutzer können Sie dieses Äquivalent verwenden:
function add_to_path() {
for p in ${(s.:.)2}; do
if [[ ! "${(P)1}" =~ "${p%/}" ]]; then
new_path="$p:${(P)1#:}"
export "$1"="${new_path%:}"
fi
done
}
Bearbeiten 28/8/2018
Eine weitere Sache, die ich mit diesem Skript machen konnte, war, den Pfad zu korrigieren. Also .bashrc
mache ich am Anfang meiner Datei so etwas:
_temp_path="$PATH"
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
add_to_path 'PATH' "$_temp_path"
unset _temp_path
Es liegt an Ihnen, mit was das PATH
beginnen soll. Untersuche PATH
zuerst, um zu entscheiden.
~/.profile
und ~/.bashrc
von~/.bash_profile
~/.profile
wenn~/.bash_profile
nicht vorhanden ist ...