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
wenn~/.bash_profile
nicht vorhanden ist ...~/.profile
und~/.bashrc
von~/.bash_profile
Antworten:
Wenn Ihr System über Folgendes verfügt
strace
, können Sie die von der Shell geöffneten Dateien auflisten, z. B. mit(
-li
Bedeutet interaktive Anmeldeshell; nur-i
für eine interaktive Shell ohne Anmeldung verwenden.)Daraufhin wird eine Liste der Dateien angezeigt, die die Shell geöffnet hat oder zu öffnen versucht hat. Auf meinem System lauten sie wie folgt:
/etc/profile
/etc/profile.d/*
(verschiedene Skripte in/etc/profile.d/
)/home/<username>/.bash_profile
(dies schlägt fehl, ich habe keine solche Datei)/home/<username>/.bash_login
(dies schlägt fehl, ich habe keine solche Datei)/home/<username>/.profile
/home/<username>/.bashrc
/home/<username>/.bash_history
(Befehlszeilenverlauf; dies ist kein Skript)/usr/share/bash-completion/bash_completion
/etc/bash_completion.d/*
(verschiedene Skripte mit Autovervollständigungsfunktionen)/etc/inputrc
(definiert Tastenkombinationen; dies ist kein Skript)Verwenden Sie
man strace
für weitere Informationen.quelle
echo $0
im Terminal gibt-bash
eher als das zu erwartenbash
. Haben Sie noch weitere Vorschläge dazu?$0
ein Bindestrich-
ist oder mit der Option aufgerufen wird-l
.echo PATH=\""$PATH"\"
am Anfang und Ende von.profile
und setzen.bashrc
? Und warum tun Sie nicht das, was jeder tut, und setzen den PATH entweder vollständig oder, wenn Sie ein Verzeichnis hinzufügen, geschützt aufecho ":$PATH:" | grep -q ":/path/to/dir:" || export PATH="$PATH:/path/to/dir"
:?sudo bash -c "echo exit|dtruss bash -li|& less|grep '^open'"
auf MacOS. (ersetzen Sie einfachstrace
mitdtruss
)