Die Frage sagt alles. Ich benutze derzeit Arch Linux und das zsh, aber ich hätte gerne eine Lösung, die (zumindest) sowohl auf VTs als auch in xterms funktioniert und auch (hoffentlich, vorzugsweise) weiterhin funktioniert, wenn ich Distributionen oder Shells wechsle.
Ich habe wild unterschiedliche Antworten auf diese Frage in den Dokumenten verschiedener Distributionen gehört. Ubuntu sagt "use .pam_environment". Ich denke in Arch, was sie empfehlen, hängt von Ihrer Muschel ab. Momentan füge ich alles in .profile ein und wenn eine Shell das aus irgendeinem Grund nicht erzeugt (zB bash, wenn .bash_profile existiert), überschreibe ich dies, indem ich es manuell beschaffe. Aber es scheint einen besseren Weg zu geben.
shell
environment-variables
login
strugee
quelle
quelle
Antworten:
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 wiesu -c somecommand
undssh 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.export
und einem einzelnen Leerzeichen beginnen (kein Tabulator, go figure).VAR=VALUE
in der VAR aus Buchstaben, Ziffern und Unterstrichen besteht.#
Beginnt ein Kommentar, kann er nicht in einem Wert erscheinen.'
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 .=
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: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 ändernWann 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: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
: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 Prozessrshd
oder heißtsshd
. So können Sie beginnen~/.bashrc
mitZsh 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
.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.quelle
case $- in *i*)
tun?;;
oderesac
), wenn es$-
mit dem Muster übereinstimmt*i*
, dh wenn es$-
enthälti
, dh wenn die Shell interaktiv ist.$-
ist eine Zeichenfolge der aktuell festgelegten Shell-Optionen. (wieset -x
).i
bedeutet interaktive Shell.~/.config/env
, auch ohne Emulation?.profile
an ziemlich alte Bourne-Muscheln, aber ich erkenne, dass es einigen Leuten einfach egal ist. Ich habe nichts gegen Leute, die davon ausgehen, dass sh = bash für ihre eigenen Dateien ist. Es interessiert mich nur, ob sie Skripte veröffentlichen#!/bin/sh
, die bash-Funktionen verwenden.Soweit mir bekannt ist, gibt es keinen distro- und shellunabhängigen Standard zum Setzen von Umgebungsvariablen.
Die häufigste und de - facto - Standard zu sein scheint
/etc/profile
und~/.profile
. Die zweithäufigste scheint zu sein ,/etc/environment
und~/.pam_environment
.Mir scheint, dass alle Unterlagen, die ich gefunden habe, Sie auch schon gefunden haben. Ich liste sie hier trotzdem für die anderen Leser auf.
/etc/profile
und~/.profile
( Link )./etc/environment
und~/.pam_environment
( Link )./etc/profile
und/etc/environment
( Link ).Bonus: Ein Text, der die Verwendung und / oder den Missbrauch von
/etc/environment
in Debian in Frage stellt ( Link , letzte Aktualisierung 2008).quelle
sh
? Solange Sie sich an POSIX halten, hätte ich gedacht, dass es Ihnen gut geht ...csh
und Freunde der POSIX-Art zuweisen (Sie brauchen etwas wieset
odersetenv
)Ich habe das folgende Skript ~ / bin / agnostic_setenv hinzugefügt:
Und in ~ / .perl-homedir verwende ich:
Ein ähnliches Skript für agnostic_unsetenv:
quelle