GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist der beste distro-/shellunabhängige Weg, um Umgebungsvariablen festzulegen?

Die Frage sagt alles. Ich verwende derzeit Arch Linux und zsh, aber ich hätte gerne eine Lösung, die (mindestens) sowohl auf VTs als auch in xterms funktioniert und auch (hoffentlich, vorzugsweise) weiterhin funktioniert, wenn ich Distributionen oder Shells wechsle.

Ich habe in den Dokumenten verschiedener Distributionen sehr unterschiedliche Antworten auf diese Frage gehört. Ubuntu sagt „use .pam_environment“. Ich denke, was sie in Arch empfehlen, hängt von Ihrer Shell ab. Derzeit lege ich alles in .profile und wenn eine Shell das aus irgendeinem Grund nicht bezieht (z. B. bash, wenn .bash_profile existiert), überschreibe ich das, indem ich es manuell beziehe. Aber es scheint, als müsste es einen besseren Weg geben.

Akzeptierte Antwort:

Leider gibt es keinen vollständig portablen Speicherort zum Setzen von Umgebungsvariablen. Die zwei Dateien, die am nächsten kommen, sind ~/.profile , das ist der traditionelle Speicherort und funktioniert bei vielen Setups sofort, und ~/.pam_environment , eine moderne, alltägliche, aber begrenzte Alternative.

Was in ~/.pam_environment einzufügen ist

Die Datei ~/.pam_environment wird von allen Anmeldemethoden gelesen, die PAM verwenden und bei denen diese Datei aktiviert ist. Dies deckt heutzutage die meisten Linux-Systeme ab.

Der große Vorteil von ~/.pam_environment ist, dass es (wenn aktiviert) gelesen wird, bevor die Shell des Benutzers startet, sodass es unabhängig vom Sitzungstyp, der Login-Shell und anderen Komplexitäten funktioniert. Es funktioniert sogar für nicht interaktive Anmeldungen wie su -c somecommand und ssh somecommand .

Die Haupteinschränkung von ~/.pam_environment ist, dass Sie dort nur einfache Zuweisungen platzieren können, keine komplexe Shell-Syntax. Die Syntax dieser Datei lautet wie folgt.

  • Dateien werden Zeile für Zeile geparst.
  • Jede Zeile muss die Form VAR=VALUE haben wobei VAR aus Buchstaben, Ziffern und Unterstrichen besteht. Die alternative Form VAR DEFAULT=value ermöglicht Erweiterungen von Umgebungsvariablen mit ${VAR} Syntax und die speziellen Variablen @{HOME} und @{SHELL} .
  • # startet einen Kommentar, er kann nicht in einem Wert erscheinen.
  • Wenn VALUE von " umgeben ist , dann wird VAR auf den String zwischen den Anführungszeichen gesetzt.
  • $ oder @ fügen Sie ein wörtliches $ ein oder @ und lange Zeilen können geteilt werden, indem der Zeilenumbruch mit einem maskiert wird .
  • Bei einem Syntaxfehler wie z. B. kein = oder Leerzeichen ohne Anführungszeichen, wird die Variable aus der Umgebung entfernt.

Auf der anderen Seite also ~/.pam_environment funktioniert in einer Vielzahl von Situationen. Auf der anderen Seite können Sie die Ausgabe eines Befehls (z. B. testen, ob ein Verzeichnis oder Programm vorhanden ist) nicht verwenden, und einige Zeichen (#" , Zeilenumbruch) sind unmöglich oder mühsam, den Wert einzugeben.

Was in ~/.profile einzufügen ist

Diese Datei sollte eine portable (POSIX) sh-Syntax haben. Verwenden Sie nur ksh- oder bash-Erweiterungen (Arrays, [[ … ]] usw.), wenn Sie wissen, dass Ihr System diese Shells als /bin/sh hat .

Diese Datei kann von Skripten in automatisierten Anwendungen gelesen werden, daher sollte sie keine Programme aufrufen, die eine Ausgabe erzeugen oder exec aufrufen . 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 von /bin/sh als Ihre Login-Shell und wechseln Sie zu Ihrer bevorzugten Shell. Sehen Sie auch, wie ich Bash als Anmelde-Shell verwenden kann, wenn mein Systemadministrator mich nicht ändern lässt

Verwandte Themen:Wie richte ich eine systemweite Tastenkombination ein, um eine bestimmte Systemeinstellung umzuschalten („Zum Klicken tippen“)?

Wann ist ~/.profile bei nicht-grafischer Anmeldung nicht gelesen?

Unterschiedliche Login-Shells lesen unterschiedliche Dateien.

Wenn Ihre Login-Shell Bash ist

Bash liest ~/.bash_login oder ~/.bash_profile falls sie anstelle von ~/.profile existieren . Auch liest bash ~/.bashrc nicht in einer Login-Shell, auch wenn sie interaktiv ist. Um sich diese Macken nie wieder merken zu müssen, erstellen Sie ein ~/.bash_profile mit den folgenden zwei Zeilen:

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

Wenn Ihre Login-Shell zsh ist

Zsh liest ~/.zprofile und ~/.zlogin , aber nicht ~/.profile . Zsh hat eine andere Syntax als sh, kann aber ~/.profile lesen im Sh-Emulationsmodus. Sie können dies für Ihr ~/.zprofile verwenden :

emulate sh -c '. ~/.profile'

Wenn Ihre Login-Shell eine andere Shell ist

Dort können Sie nicht viel tun, außer /bin/sh zu verwenden als Ihre Anmelde-Shell und Ihre Lieblings-Shell (z. B. Fisch) nur als interaktive Shell. Das mache ich mit zsh. Siehe oben für ein Beispiel zum Aufrufen einer anderen Shell von ~/.profile .

Remote-Befehle

Wenn Sie einen entfernten Befehl aufrufen, ohne eine interaktive Shell zu durchlaufen, lesen nicht alle Shells eine Startdatei.

Ksh liest die durch ENV angegebene Datei Variable, wenn Sie es schaffen, sie zu übergeben.

Bash liest ~/.bashrc wenn es nicht interaktiv ist (!) und sein übergeordneter Prozess heißt rshd oder sshd . Sie können also Ihre ~/.bashrc starten mit

if [[ $- != *i* ]]; then
  . ~/.profile
  return
fi

Zsh liest immer ~/.zshenv wenn es beginnt. Verwenden Sie es mit Vorsicht, da dies von jeder einzelnen Instanz von zsh gelesen wird, selbst wenn es sich um eine Subshell handelt, in der Sie andere Variablen festgelegt haben. Wenn zsh Ihre Login-Shell ist und Sie es verwenden möchten, um Variablen nur für entfernte Befehle zu setzen, verwenden Sie einen Wächter:Setzen Sie eine Variable in ~/.profile , wie zum Beispiel MY_ENVIRONMENT_HAS_BEEN_SET=yes , und überprüfen Sie diesen Wächter, bevor Sie ~/.profile lesen .

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 sorgen dafür, dass ~/.profile ausgeführt wird , entweder indem Sie es explizit aus den Startskripten beziehen oder indem Sie eine Login-Shell ausführen.

Leider gibt es keine allgemeine Methode, um Distribution/DM/DE-Kombinationen zu handhaben, bei denen ~/.profile wird nicht gelesen.

Wenn Sie eine herkömmliche Sitzung verwenden, die mit ~/.xsession gestartet wurde , hier sollten Sie Ihre Umgebungsvariablen setzen; Tun Sie dies, indem Sie ~/.profile beschaffen (d. h. . ~/.profile ). Beachten Sie, dass in einigen Setups die Startskripts der Desktop-Umgebung ~/.profile als Quelle verwenden wieder.


Linux
  1. Was ist der beste Weg, um ein Segment aus einer Textdatei zu entnehmen?

  2. Was ist der beste Weg, um die Anzahl der Dateien in einem Verzeichnis zu zählen?

  3. Weg zum Abrufen des Namens der Desktop-Umgebung??

  4. Gibt es eine Möglichkeit, die Umgebungsvariablen eines anderen Prozesses in Unix zu ändern?

  5. Was ist der beste Weg, um eine Umgebungsvariable in .bashrc festzulegen?

So legen Sie die Umgebungsvariable in Windows fest

So legen Sie Umgebungsvariablen in MacOS fest

So setzen und listen Sie Umgebungsvariablen in Linux auf

Und die beste Distribution des Jahres 2019 ist ...

So setzen und löschen Sie Umgebungsvariablen unter Linux

Die crontab-Ausführung hat nicht die gleichen Umgebungsvariablen wie der ausführende Benutzer