Diese Antwort bezieht sich hauptsächlich auf die Reihenfolge, in der Umgebungsvariablen PATH
zugewiesen werden, wenn sie in verschiedenen Konfigurationsdateien angegeben werden. Ich beschreibe auch, wo Sie sie normalerweise einstellen sollten, aber die folgende Liste listet die Dateien nicht in der Reihenfolge auf, in der Sie sie verwenden sollten. Für allgemeine Informationen zum Setzen PATH
und zu anderen Umgebungsvariablen in Ubuntu empfehle ich auch, EnvironmentVariables und die anderen Antworten auf diese Frage zu lesen .
Der bevorzugte Einstellungsort PATH
hängt davon ab, für welche Benutzer Sie ihn festlegen müssen und wann und wie er festgelegt werden soll. Ein Teil Ihrer Entscheidung wird sein, ob Sie eine Umgebungsvariable für alle Benutzer oder auf Benutzerbasis festlegen möchten. Wenn Sie sich nicht sicher sind, empfehle ich, die Einstellung nur für einen Benutzer (z. B. Ihr Konto) und nicht für das gesamte System vorzunehmen.
Wie AlexP sagt , hat die PATH
Umgebungsvariable den Wert, dem sie zuletzt zugewiesen wurde . In der Praxis nehmen Sie die meiste Zeit, die Sie einstellen PATH
, den alten Wert von PATH
in den neuen Wert auf, sodass die vorherigen Einträge beibehalten werden.
Wenn also in der Praxis PATH
mehrere Dateien festgelegt werden, enthält es normalerweise die Einträge, die in allen Dateien angegeben sind. Dies geschieht jedoch nur, weil alle Dateien, mit Ausnahme der ersten, auf die PATH
Variable selbst verweisen , wodurch der alte Wert in den neuen Wert übernommen wird.
Daher fragen Sie tatsächlich nach der Reihenfolge, in der die PATH
Einstellungen in verschiedenen Dateien wirksam werden.
Die allgemeinen Einstellungsorte PATH
sind unten in der Reihenfolge aufgeführt, in der sie bei der Anmeldung eines Benutzers wirksam werden, nicht in der Reihenfolge, die Sie normalerweise in Betracht ziehen sollten . Jeder der unten aufgelisteten Orte ist PATH
in manchen Situationen eine vernünftige Wahl , aber nur wenige sind die meiste Zeit eine gute Wahl.
In der folgenden Liste sehen Sie einige Verzeichnisnamen wie ~/.profile
. Wenn Sie mit der Tilde-Erweiterung nicht vertraut sind , ~/
beziehen Sie sich auf das Basisverzeichnis des aktuellen Benutzers. Ich benutze diese Syntax hauptsächlich aus Gründen der Kompaktheit. Es wird in Shell-Skripten unterstützt, jedoch nicht in PAM-Konfigurationsdateien.
1. Für alle Benutzer: /etc/environment
PAM unter Ubuntu bewirkt, dass die in aufgelisteten Umgebungsvariablen /etc/environment
gesetzt werden, falls diese Datei existiert, was standardmäßig der Fall ist. Auf diese Weise werden Umgebungsvariablen für alle Benutzer am häufigsten festgelegt.
$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
Wenn Sie Umgebungsvariablen nicht nur für Ihr Benutzerkonto, sondern für alle Benutzerkonten festlegen müssen , ist es wahrscheinlich die beste Wahl, diese Datei zu ändern. Ich empfehle es zuerst zu sichern. Eine Möglichkeit zum Sichern dieser Datei besteht darin, Folgendes auszuführen:
sudo cp /etc/environment /etc/environment.orig
Die .orig
Erweiterung ist nicht speziell erforderlich. Sie können der Sicherungsdatei einen Namen geben, der nicht verwirrend ist oder bereits verwendet wird. (Außer .orig
, .old
, .backup
und .bak
sind häufig.)
Sie können diese Datei in beliebiger Weise bearbeiten Sie können jede andere Datei als Root - Benutzer bearbeiten ( sudoedit /etc/enviromnment
, sudo nano -w /etc/environment
, gksudo gedit /etc/environment
, etc.)
/etc/environment
unterstützt nicht das automatische Einfügen des alten Werts einer Variablen. Dies ist jedoch in der Regel nicht erforderlich, da Sie die meiste Zeit durch Bearbeiten eine Umgebungsvariable für alle Benutzer festlegen /etc/environment
würden, sollte dies ohnehin der Anfangswert sein, wenn sich der Benutzer anmeldet. Der Benutzer kann es dann nach Belieben ändern. In der Regel ist es gut für Benutzer, dies zu tun.
2. Für alle Benutzer: /etc/security/pam_env.conf
PAM liest Umgebungsvariablen für alle Benutzer aus /etc/security/pam_env.conf
, die mit derselben Syntax wie in Benutzerdateien ~/.pam_environment
angegeben sind (siehe unten).
Wenn in beiden /etc/environment
und dieselbe Umgebungsvariable festgelegt ist /etc/security/pam_env.conf
, wird der Wert in pam_env.conf
verwendet - auch wenn dieser Wert als DEFAULT
und nicht als angegeben ist OVERRIDE
.
Wenn Sie jedoch eine Zeile in environment
durch eine in ersetzen pam_env.conf
, können Sie den Inhalt des ersetzten Werts einschließen. Weitere .pam_environment
Informationen finden Sie im Abschnitt weiter unten (da dieselbe Syntax verwendet wird).
Das Bearbeiten ist normalerweise nicht erforderlich, pam_env.conf
und Sie sollten sehr vorsichtig sein , da eine fehlerhafte Zeile normalerweise verhindert, dass sich alle normalen Benutzerkonten überhaupt anmelden. Beispielsweise pam_env.conf
enthält der Standard die Zeilen:
#PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
Dies wird als eines von mehreren Beispielen vorgestellt. Es zeigt unter anderem, wie Sie eine Zuweisung über mehrere Zeilen aufteilen können \
. Angenommen, Sie möchten nur die erste Zeile auskommentieren, haben aber vergessen, die zweite Zeile auskommentieren:
PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
Mach das nicht!
Ich habe das gerade selbst aus Versehen getestet und es hat verhindert, dass sich Benutzer erfolgreich anmelden konnten. Um das Problem zu beheben, musste ich im Wiederherstellungsmodus booten und es wieder ändern. (Zum Glück habe ich dies auf einer virtuellen Maschine gemacht, die ich nur zum Testen von Dingen verwende, sodass ich keine Probleme hatte.)
3. Für einen Benutzer: .pam_environment
im Basisverzeichnis des Benutzers
Eine der Möglichkeiten, eine Umgebungsvariable für einen einzelnen Benutzer festzulegen, besteht darin, dass dieser Benutzer die Umgebungsvariable in seinem Basisverzeichnis bearbeitet (oder erstellt) .pam_environment
. In dieser Datei festgelegte Werte ersetzen die in der globalen /etc/environment
Datei festgelegten Werte .
.pam_environment
ist nicht Teil des Gerüsts von Dateien, die beim erstmaligen Erstellen des Benutzerkontos in den Basisordner eines Benutzers kopiert werden. Wenn Sie diese Datei jedoch in Ihrem Ausgangsverzeichnis erstellen, können Sie damit Umgebungsvariablen wie festlegen PATH
. Im Gegensatz zu /etc/environment
(aber ähnlich /etc/security/pam_env.conf
) unterstützen die benutzerspezifischen .pam_environment
Dateien das Erweitern des alten Werts einer Umgebungsvariablen in einen neuen. Es handelt sich jedoch nicht um Shell-Skripte, und Sie müssen eine spezielle Syntax verwenden, um dies zu erreichen, die sich etwas von der Syntax unterscheidet, die Sie in einer Datei wie dieser verwenden würden .profile
.
Wenn Sie beispielsweise ein bin2
Verzeichnis in Ihrem Ausgangsverzeichnis hatten, das Sie am Ende von hinzufügen wollten PATH
, können Sie dies tun, indem Sie diese Zeile hinzufügen zu .pam_environment
:
PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2
Siehe den ~/.pam_environment
Unterabschnitt von Environment (aus dem das obige Beispiel eng angepasst ist), man pam_env
und man pam_env.conf
für weitere Details.
Obwohl dies einst als bevorzugte Möglichkeit für Ubuntu-Benutzer angepriesen wurde, Umgebungsvariablen zu ändern oder hinzuzufügen, sollten Sie beim Bearbeiten vorsichtig sein.pam_environment
. Wie bei systemweiten Änderungen /etc/security/pam_env.conf
(siehe oben) verhindert eine fehlerhafte Zeile in der .pam_environment
Datei eines Benutzers, dass die Anmeldung erfolgreich ist. (I diese getestet haben -. Absichtlich dieses Mal) Informationen darüber , wie die Empfehlungen haben entwickelt , siehe Gunnar Hjalmarsson ‚s Kommentare unten und diese ubuntu-devel
Diskussion .
Ein solcher Fehler ist im Allgemeinen weitaus weniger schwerwiegend als ein fehlerhafter Line-In pam_env.conf
, da er nur einen Benutzer betrifft. Bei einem Desktop-Ubuntu-System mit nur einem Benutzerkonto, das Anmeldungen zulässt, ist ein solcher Fehler beim Bearbeiten .pam_environment
jedoch genauso schlimm wie ein Fehler beim Bearbeiten pam_env.conf
- wenn Sie nicht bereits angemeldet sind, können Sie dies nicht um es zu reparieren, ohne im Wiederherstellungsmodus zu booten (oder von einem Live-USB usw.).
(Wenn Sie über andere Benutzerkonten verfügen, können Sie sich als ein anderer Benutzer anmelden und das Problem beheben. Auch wenn Sie kein Administrator sind und sich nicht sudo
als Root anmelden können , können Sie weiterhin ausgeführt werden und zur Eingabe Ihres (nicht ihres) Kennworts aufgefordert werden . Das Gastkonto kann dies jedoch nicht tun, da sie von der Verwendung verboten ist über die Identität eines anderen Benutzers zu übernehmen.)su your-account
su
4. Für alle Benutzer: /etc/profile
und Dateien darin/etc/profile.d/
Borowski-kompatible Shells (einschließlich bash
der Standardbenutzershell in Ubuntu) führen die Befehle aus, /etc/profile
wenn sie als Anmeldeshell aufgerufen werden.
Ubuntu /etc/profile.d
endet mit:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
Dies bewirkt, dass die Befehle in jeder Datei im /etc/profile.d/
Verzeichnis, deren Name auf endet .sh
, ebenfalls ausgeführt werden.
Die meisten Display-Manager führen die Befehle in /etc/profile
(und damit die Dateien in /etc/profile.d
) auch für grafische Anmeldungen aus. Dies ist jedoch nicht bei allen der Fall , und dies ist ein wichtiges Argument für die Verwendung der von PAM bereitgestellten Funktionen (siehe oben) - es sei denn, es werden niemals grafische Anmeldungen für dieses System vorgenommen, was beispielsweise der Fall sein könnte ein Server ohne GUI installiert.
Es ist traditionell, systemweite Umgebungsvariablen festzulegen /etc/profile
, aber dies ist oft nicht mehr die beste Wahl. Wenn Sie keine Umgebungsvariable in /etc/environment
festlegen können und diese für alle Benutzer festlegen müssen, ist es wahrscheinlich besser, eine neue Datei in /etc/profile.d/
zu erstellen, als sich /etc/profile
selbst zu bearbeiten . Ein Grund dafür ist, dass beim Upgrade von Ubuntu möglicherweise eine neue Standarddatei vorhanden /etc/profile
ist. Abhängig davon, wie Sie das Upgrade durchführen, wird entweder die alte Datei (mit Ihren Änderungen) beibehalten, die dieser bestimmten aktualisierten Konfigurationsdatei vorausgeht, oder Sie werden aufgefordert, die Situation zu behandeln.
Wann wird dieselbe Umgebungsvariable in beiden /etc/profile
und einer oder mehreren Dateien in gesetzt /etc/profile.d
? Was wird zuletzt ausgeführt? Dies hängt davon ab, ob die Befehle in /etc/profile
dieser Gruppe vor oder nach der Quelle der Dateien profile.d
angezeigt werden (gemäß dem oben angegebenen Code). Befehle in /etc/profile
werden in der Reihenfolge ausgeführt, in der sie erscheinen.
/etc/profile
ist ein Shell-Skript und seine Syntax stimmt nicht mit der der oben beschriebenen PAM-Konfigurationsdateien überein . Die Syntax entspricht der Syntax für die Benutzerdatei ~/.profile
(siehe unten).
Wenn Sie Code schreiben müssen , die entscheidet , ob ein bestimmtes Verzeichnis hinzuzufügen PATH
(und so für alle Benutzer zu tun), werden Sie nicht in der Lage sein zu verwenden /etc/environment
oder /etc/security/pam_env.conf
das zu tun. Dies ist vielleicht die Hauptsituation, in der es besser ist, /etc/profile
oder /etc/profile.d/
stattdessen zu verwenden.
5. Für einen Benutzer: .bash_profile
im Home-Verzeichnis des Benutzers
Wenn dies ein Benutzer hat ~/.bash_profile
, verwendet bash es anstelle von ~/.profile
oder ~/.bash_login
(siehe unten). Sie sollten normalerweise kein .bash_profile
in Ihrem Home-Verzeichnis haben.
Wenn Sie dies tun, sollte es normalerweise einen Befehl zur Quelle enthalten ~/.profile
(z . "$HOME/.profile"
. B. ). Andernfalls wird der Inhalt der Benutzerdatei .profile
überhaupt nicht ausgeführt.
6. Für einen Benutzer: .bash_login
im Home-Verzeichnis des Benutzers
Wenn dies ein Benutzer ~/.bash_login
getan hat , verwendet bash es anstelle von ~/.profile
(siehe unten), sofern ~/.bash_profile
es nicht existiert. In diesem Fall wird keines der anderen verwendet, es sei denn, es wurde von ~ / .bash_login bezogen.
Wie bei .bash_profile
sollten Sie normalerweise keine .bash_login
Datei in Ihrem Home-Verzeichnis haben.
7. Für einen Benutzer: .profile
im Home-Verzeichnis des Benutzers.
Wenn eine Shell im Bourne-Stil als Anmeldeshell ausgeführt wird, werden die Befehle ausgeführt /etc/profile
(einschließlich der Befehle, mit denen die Befehle in Dateien /etc/profile.d/
ausgeführt werden - siehe oben). Danach werden die Befehle im Basisverzeichnis .profile
des Benutzers ausgeführt. Diese Datei ist für jeden Benutzer separat. (Bash wird tatsächlich ausgeführt .bash_profile
oder .bash_login
stattdessen, wenn sie vorhanden sind. Für Benutzer auf einem Ubuntu-System sollten oder existieren diese Dateien jedoch nur selten. Einzelheiten siehe oben und 6.2 Bash-Startdateien im Bash-Handbuch .)
~/.profile
Dies ist der Hauptort, an dem Benutzer Befehle eingeben können, die bei der Anmeldung ausgeführt werden. PATH
Dies ist der traditionelle Ort, an dem Sie Ihre Einstellungen vornehmen können. Da Ubuntu das Modul pam_env unterstützt ~/.pam_environment
, sollten Sie dies in Erwägung ziehen.
Wie bei führen /etc/profile
nicht alle Display-Manager diese Datei für grafische Anmeldungen aus, obwohl die meisten dies tun. Dies ist ein Grund zu bevorzugen ~/.pam_environment
für die Einstellung von Umgebungsvariablen (viel wie eine vielleicht lieber /etc/environment
zu /etc/profile
).
Sie können Umgebungsvariablen erweitern, einschließlich PATH
sich selbst, wenn Sie die Einstellung PATH
in .pam_environment
(siehe oben). Wenn Sie jedoch komplexere Einstellungen PATH
vornehmen müssen, müssen Sie möglicherweise Ihre .profile
verwenden. Wenn Sie insbesondere bei jeder Anmeldung eines Benutzers überprüfen möchten, ob ein Verzeichnis vorhanden ist, und es nur hinzufügen möchten, PATH
wenn dies der Fall ist, können Sie Ihre .pam_environment
Datei nicht verwenden, um dieses Verzeichnis zu Ihrem hinzuzufügen PATH
.
Zum Beispiel kann die Standard - pro-Benutzer - .profile
Datei auf Ubuntu verwendet , um am Ende mit:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
Siehe Gunnar Hjalmarsson ‚s Kommentar auf Byte Antwort des Kommandanten für weitere Einzelheiten.
Dies überprüft, ob Sie ein bin
Unterverzeichnis Ihres Home-Verzeichnisses haben. In diesem Fall wird dieses Unterverzeichnis an den Anfang Ihres Ordners angehängt PATH
.
Diese Liste lässt einige Möglichkeiten aus.
Es gibt andere Möglichkeiten, wie Umgebungsvariablen beim Anmelden von Benutzern festgelegt werden, die stärker von der Art der Anmeldung abhängen. Beispielsweise können gelegentlich Umgebungsvariablen vorhanden sein, die nur für grafische Anmeldungen oder nur für SSH-basierte Remoteanmeldungen festgelegt werden. Die obige Liste deckt solche Fälle nicht ab.
Ich habe einige Dateien ausgelassen, in denen Benutzer manchmal Umgebungsvariablen definieren, wie z. B. ~/.bashrc
und /etc/bash.bashrc
, da diese Orte im Allgemeinen nicht empfohlen werden PATH
und Sie sie selten für diesen Zweck verwenden sollten. Wenn Sie diese Dateien zum Hinzufügen von Verzeichnissen verwenden PATH
, werden sie manchmal mehrmals hinzugefügt und sind bei der Prüfung sehr verwirrend $PATH
. (In extremen Fällen kann dies die Arbeit verlangsamen, aber normalerweise geht es nur darum, alles sauber und verständlich zu halten.)
Da bash
Ubuntus Standard-Login-Shell für Benutzer ist und die meisten Benutzer sie oder eine andere POSIX-kompatible Shell verwenden, habe ich Informationen darüber weggelassen, wie Umgebungsvariablen in anderen, nicht Bourne-artigen Shells wie festgelegt werden tcsh
.