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_environment
eine moderne, alltägliche, aber eingeschränkte Alternative.
Was ist einzutragen? ~/.pam_environment
Die Datei ~/.pam_environment
wird 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_environment
ist, 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 somecommand
und ssh somecommand
.
Die größte Einschränkung ~/.pam_environment
besteht 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
export
und einem einzelnen Leerzeichen beginnen (kein Tabulator, go figure).
- Danach muss jede Zeile die Form haben,
VAR=VALUE
in 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_environment
funktioniert 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/sh
als 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 ~/.profile
bei nicht grafischer Anmeldung nicht gelesen?
Verschiedene Login-Shells lesen verschiedene Dateien.
Wenn Ihre Login-Shell bash ist
Bash liest ~/.bash_login
oder ~/.bash_profile
ob sie statt existieren ~/.profile
. Bash liest ~/.bashrc
auch dann keine Login-Shell ein, wenn sie interaktiv ist. Um sich diese Macken nie wieder merken zu müssen, erstellen Sie eine ~/.bash_profile
mit 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 ~/.zprofile
und ~/.zlogin
, aber nicht ~/.profile
. Zsh hat eine andere Syntax als sh, kann jedoch ~/.profile
im 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/sh
als 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 ENV
Variablen angegebene Datei , wenn Sie es schaffen, sie zu übergeben.
Bash liest, ~/.bashrc
ob es nicht interaktiv (!) Ist und sein übergeordneter Prozess rshd
oder heißt sshd
. So können Sie beginnen ~/.bashrc
mit
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh liest immer, ~/.zshenv
wenn 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 ~/.profile
nicht 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 ~/.profile
erneut ausgeführt werden.