Es gibt leider keinen vollständig portierbaren Speicherort zum Festlegen von Umgebungsvariablen. Die beiden Dateien, die am nächsten kommen ~/.profile, sind : Dies ist der traditionelle Speicherort, der bei vielen Setups sofort einsatzbereit ist, und ~/.pam_environmenteine moderne, alltägliche, aber eingeschränkte Alternative.
Was ist einzutragen? ~/.pam_environment
Die Datei ~/.pam_environmentwird von allen Anmeldemethoden gelesen, die PAM verwenden und für die diese Datei aktiviert ist. Dies gilt heutzutage für die meisten Linux-Systeme.
Der Hauptvorteil von ~/.pam_environmentist, dass es (wenn aktiviert) gelesen wird, bevor die Shell des Benutzers gestartet wird, sodass es unabhängig vom Sitzungstyp, der Anmeldeshell und anderen Komplexitäten funktioniert. Es funktioniert sogar für nicht interaktive Anmeldungen wie su -c somecommandund ssh somecommand.
Die größte Einschränkung ~/.pam_environmentbesteht darin, dass Sie dort nur einfache Zuweisungen vornehmen können, keine komplexe Shell-Syntax. Die Syntax dieser Datei lautet wie folgt.
- Dateien werden zeilenweise analysiert.
- Führende Leerzeichen werden ignoriert.
- Sie können optional Zeilen mit
exportund einem einzelnen Leerzeichen beginnen (kein Tabulator, go figure).
- Danach muss jede Zeile die Form haben,
VAR=VALUEin der VAR aus Buchstaben, Ziffern und Unterstrichen besteht.
# Beginnt ein Kommentar, kann er nicht in einem Wert erscheinen.
- Wenn VALUE mit
'oder beginnt "und ein anderes identisches Anführungszeichen enthält, wird VAR auf die Zeichenfolge zwischen den Anführungszeichen gesetzt (alles, was nach dem zweiten Anführungszeichen folgt, wird ignoriert). Andernfalls wird VAR nach dem =Vorzeichen auf den String gesetzt .
- Wenn dies nicht
=der Fall ist, wird die Variable aus der Umgebung entfernt.
Auf der anderen Seite ~/.pam_environmentfunktioniert es also unter einer Vielzahl von Umständen. Auf der anderen Seite können Sie keine dynamischen Einstellungen vornehmen, z. B. den Wert einer Variablen auf eine andere Variable stützen (z. B. ein Verzeichnis zu PATH hinzufügen) oder die Ausgabe eines Befehls verwenden (z. B. testen, ob ein Verzeichnis oder ein Programm vorhanden ist) Zeichen ( #'", Zeilenvorschub) können nicht oder nur mühsam in den Wert eingegeben werden.
Was ist einzutragen? ~/.profile
Diese Datei sollte eine portable (POSIX) sh-Syntax haben. Verwenden Sie ksh- oder bash-Erweiterungen (Arrays [[ … ]]usw.) nur, wenn Sie wissen, dass Ihr System über diese Shells verfügt /bin/sh.
Diese Datei kann von Skripten in automatisierten Anwendungen gelesen werden, daher sollten keine Programme aufgerufen werden, die eine Ausgabe oder einen Aufruf erzeugen exec. Wenn Sie dies bei Anmeldungen im Textmodus tun möchten, tun Sie dies nur für interaktive Shells. Beispiel:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
Dies ist ein Beispiel für die Verwendung /bin/shals Anmeldeshell und den Wechsel zu Ihrer bevorzugten Shell. Siehe auch, wie ich bash als Anmeldeshell verwenden kann, wenn mein Sysadmin es ablehnt, dies zu ändern
Wann wird ~/.profilebei nicht grafischer Anmeldung nicht gelesen?
Verschiedene Login-Shells lesen verschiedene Dateien.
Wenn Ihre Login-Shell bash ist
Bash liest ~/.bash_loginoder ~/.bash_profileob sie statt existieren ~/.profile. Bash liest ~/.bashrcauch dann keine Login-Shell ein, wenn sie interaktiv ist. Um sich diese Macken nie wieder merken zu müssen, erstellen Sie eine ~/.bash_profilemit den folgenden zwei Zeilen:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
Siehe auch Welche Setup-Dateien sollten zum Einrichten von Umgebungsvariablen mit bash verwendet werden?
Wenn Ihre Login-Shell zsh ist
Zsh liest ~/.zprofileund ~/.zlogin, aber nicht ~/.profile. Zsh hat eine andere Syntax als sh, kann jedoch ~/.profileim sh-Emulationsmodus lesen . Sie können dies verwenden für ~/.zprofile:
emulate sh -c '. ~/.profile'
Siehe auch Zsh trifft nicht ~ / .profile
Wenn Ihre Login-Shell eine andere Shell ist
Sie können dort nicht viel tun, außer /bin/shals Anmeldeshell und als interaktive Shell Ihre Lieblingsshell (z. B. Fisch) zu verwenden. Das ist was ich mit zsh mache. Ein Beispiel zum Aufrufen einer anderen Shell von finden Sie oben ~/.profile.
Remote-Befehle
Wenn Sie einen Remote-Befehl aufrufen, ohne eine interaktive Shell zu durchlaufen, lesen nicht alle Shells eine Startdatei.
Ksh liest die von der ENVVariablen angegebene Datei , wenn Sie es schaffen, sie zu übergeben.
Bash liest, ~/.bashrcob es nicht interaktiv (!) Ist und sein übergeordneter Prozess rshdoder heißt sshd. So können Sie beginnen ~/.bashrcmit
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh liest immer, ~/.zshenvwenn es anfängt. Seien Sie vorsichtig, da dies von jeder einzelnen Instanz von zsh gelesen wird, auch wenn es sich um eine Subshell handelt, in der Sie andere Variablen festgelegt haben. Wenn zsh Ihre Login-Shell ist und Sie damit Variablen nur für Remote-Befehle festlegen möchten, verwenden Sie einen Guard: Setzen Sie eine Variable in ~/.profile, z. B. MY_ENVIRONMENT_HAS_BEEN_SET=yes, und überprüfen Sie diesen Guard vor dem Lesen ~/.profile.
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
Der Fall der grafischen Anmeldungen
Viele Distributionen, Display-Manager und Desktop-Umgebungen können ausgeführt werden ~/.profile, indem sie entweder explizit aus den Startskripten ausgewählt oder eine Anmeldeshell ausgeführt werden.
Leider gibt es keine allgemeine Methode, um Distro / DM / DE-Kombinationen zu verarbeiten, bei denen ~/.profilenicht gelesen wird.
Wenn Sie eine herkömmliche Sitzung verwenden, die von gestartet wurde ~/.xsession, sollten Sie hier die Umgebungsvariablen festlegen. Tun Sie es durch Sourcing ~/.profile(dh . ~/.profile). Beachten Sie, dass in einigen Setups die Startskripte der Desktop-Umgebung ~/.profileerneut ausgeführt werden.