In der Linux-Welt existieren unterschiedliche Kategorien von Umgebungsvariablen. Dieser Artikel erläutert, wie man diese einsehen, für lokale und Remote-Logins festlegen und sie auch nach einem Neustart beibehalten kann.
Die Funktionsweise von Umgebungsvariablen
Wenn ein Terminalfenster gestartet wird, greift die darin laufende Shell auf eine Reihe von Variablen zu, um eine korrekte Konfiguration zu gewährleisten. Diese Variablen stellen zudem sicher, dass alle benötigten Informationen für das Terminal und die Shell verfügbar sind. Sie definieren die gesamte Umgebung, von den grundlegenden Einstellungen bis hin zum Aussehen der Eingabeaufforderung. Aus diesem Grund werden sie als Umgebungsvariablen bezeichnet.
Manche Umgebungsvariablen sind systemweit oder global, andere wiederum sind sitzungsgebunden und nur für den aktuellen Benutzer sichtbar. Es gibt auch Variablen, die nicht in den Sitzungsumgebungsvariablen enthalten sind. Eine dritte Kategorie von Umgebungsvariablen wird direkt in der Shell definiert. Diese umfassen beispielsweise Gebietsschema-, Zeitzonen- und Tastatureinstellungen, die Suchpfade für Befehle und den Standardeditor.
Im Folgenden erfahren Sie, wie Sie die vorhandenen Umgebungsvariablen einsehen und eigene Variablen erstellen können. Zudem wird erklärt, wie man diese Variablen an untergeordnete Prozesse weitergibt und auch nach einem Neustart erhalten kann.
Umgebungen und Vererbung
Beim Start einer Shell wird eine Initialisierungsphase durchlaufen. Hierbei werden die Umgebungsvariablen eingelesen, die die Arbeitsumgebung der Shell definieren.
Wenn ein Programm oder ein Befehl von dieser Shell – dem Elternprozess – gestartet wird, erbt dieser Kindprozess die Umgebung des Elternprozesses. Es ist jedoch wichtig zu wissen, dass Variablen auch so erstellt werden können, dass sie nicht in der Umgebung des Elternprozesses vorhanden sind und somit auch nicht weitervererbt werden.
Startet der Kindprozess eine eigene Shell, initialisiert sich diese mit einem neuen Satz von Variablen. So wird beispielsweise eine geänderte Eingabeaufforderung in der Eltern-Shell nicht an die Kind-Shell weitergegeben.
Globale Umgebungsvariablen
Üblicherweise werden Umgebungsvariablen mit Namen in Großbuchstaben benannt. Hier einige Beispiele für globale Umgebungsvariablen und die Bedeutung ihrer Werte:
SHELL: Der Name der Shell, die beim Öffnen eines Terminalfensters gestartet wird. In den meisten Linux-Distributionen ist dies bash, sofern nicht anders eingestellt.
TERM: Terminalfenster emulieren Hardware-Terminals. Diese Variable enthält den Typ des emulierten Hardware-Terminals.
USER: Der Benutzername der aktuell angemeldeten Person.
PWD: Der Pfad zum aktuellen Arbeitsverzeichnis.
OLDPWD: Das Verzeichnis, in dem Sie sich vor dem Wechsel in das aktuelle Verzeichnis befanden.
LS_COLORS: Die Farbcodes für die Ausgabe des Befehls ls
zur Hervorhebung verschiedener Dateitypen.
MAIL: Der Pfad zum Postfach des aktuellen Benutzers, sofern das Mailsystem eingerichtet wurde (was standardmäßig nicht der Fall ist).
PATH: Eine Liste von Verzeichnissen, die die Shell nach ausführbaren Befehlsdateien durchsucht.
LANG: Die Einstellungen für Sprache, Lokalisierung und Zeichenkodierung.
HOME: Das Home-Verzeichnis des aktuellen Benutzers.
_: Die Umgebungsvariable Unterstrich (_) enthält den zuletzt eingegebenen Befehl.
Mit dem Befehl echo
, der die Werte in das Terminalfenster ausgibt, lassen sich die Werte dieser Variablen einfach anzeigen. Um den Wert einer Umgebungsvariablen anzuzeigen, muss dem Namen ein Dollarzeichen ($) vorangestellt werden.
Die Tab-Vervollständigung kann Ihnen das Leben erleichtern, indem Sie einen Teil des Variablennamens eintippen und dann die Tabulatortaste drücken. Die Shell vervollständigt den Namen für Sie. Wenn dies nicht funktioniert, tippen Sie einfach noch ein paar Buchstaben.
echo $SHELL
echo $LANG
echo $HOME
echo $PWD
Um eigene globale Umgebungsvariablen zu erstellen, fügen Sie diese der Datei /etc/environment
hinzu. Sie benötigen sudo
, um diese Datei bearbeiten zu können:
sudo gedit /etc/environment
Um eine Umgebungsvariable hinzuzufügen, geben Sie deren Namen, ein Gleichheitszeichen (=) und den gewünschten Wert ein. Es dürfen keine Leerzeichen vor oder nach dem Gleichheitszeichen stehen. Der Name der Umgebungsvariablen darf Buchstaben, Unterstriche (_) und Zahlen enthalten, jedoch darf das erste Zeichen keine Zahl sein. Wenn der Wert Leerzeichen enthält, schließen Sie ihn in Anführungszeichen ein („).
Speichern Sie die Datei und melden Sie sich ab und wieder an. Verwenden Sie echo
, um zu überprüfen, ob die neue Variable existiert und den von Ihnen festgelegten Wert hat:
echo $WEBSITE
Da es sich um eine globale Umgebungsvariable handelt, kann auch ein anderer Benutzer, wie z.B. „mary“, bei der nächsten Anmeldung auf diese Variable zugreifen:
echo $WEBSITE
Um alle Umgebungsvariablen anzuzeigen, verwenden Sie den Befehl printenv
. Da die Ausgabe sehr umfangreich sein kann, ist es sinnvoll, sie mit sort
zu sortieren und dann durch less
zu leiten:
printenv | sort | less
Die sortierte Liste der Umgebungsvariablen wird dann in less
angezeigt.
Sie können die Ausgabe auch durch grep
leiten, um bestimmte Umgebungsvariablen zu finden.
printenv | grep GNOME
Shell-Umgebungsvariablen
Die folgenden Shell-Umgebungsvariablen werden in der Bash verwendet, um ihr Verhalten und ihre Funktionalität zu steuern oder aufzuzeichnen. Einige dieser Werte werden im Laufe der Nutzung des Terminals aktualisiert, wie z.B. die Variable COLUMNS
, die die Breite des Terminalfensters widerspiegelt:
BASHOPTS: Die beim Starten von Bash verwendeten Befehlszeilenoptionen.
BASH_VERSION: Die Bash-Versionsnummer als Zeichenkette aus Wörtern und Zahlen.
BASH_VERSINFO: Die Bash-Version als Ziffern.
COLUMNS: Die aktuelle Breite des Terminalfensters.
DIRSTACK: Die Verzeichnisse, die dem Verzeichnisstapel mit dem Befehl pushd
hinzugefügt wurden.
HISTFILESIZE: Die maximale Anzahl von Zeilen in der Verlaufsdatei.
HISTSIZE: Die Anzahl der im Speicher zulässigen Verlaufszeilen.
HOSTNAME: Der Hostname des Computers.
IFS: Der interne Feldtrenner, der zur Trennung von Eingaben in der Befehlszeile verwendet wird. Standardmäßig ist dies ein Leerzeichen.
PS1: Die Definition der primären Eingabeaufforderung. Eine Reihe von Tokens, auch Escape-Sequenzen genannt, können in die Definition Ihrer Eingabeaufforderung aufgenommen werden. Diese repräsentieren z.B. den Host- und Benutzernamen, das aktuelle Arbeitsverzeichnis und die Uhrzeit.
PS2: Die sekundäre Eingabeaufforderung, die angezeigt wird, wenn ein Befehl über mehrere Zeilen geht und mehr Eingaben erwartet werden. Standardmäßig ist dies das Größer-als-Zeichen (>).
SHELLOPTS: Shell-Optionen, die Sie mit dem Befehl set
einstellen können.
UID: Die Benutzerkennung des aktuellen Benutzers.
Sehen wir uns einige dieser Shell-Variablen an:
echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID
Hier ist eine vollständige Liste der Tokens, die Sie in den Definitionen für die Eingabeaufforderung verwenden können:
t: Die aktuelle Uhrzeit im Format HH:MM:SS.
d: Das aktuelle Datum, ausgedrückt als Wochentag, Monat, Datum.
n: Ein Zeilenumbruchzeichen.
s: Der Name Ihrer Shell.
W: Der Name Ihres aktuellen Arbeitsverzeichnisses.
w: Der Pfad zu Ihrem aktuellen Arbeitsverzeichnis.
u: Der Benutzername der angemeldeten Person.
h: Der Hostname des Computers.
#: Jeder Befehl in der Shell ist nummeriert. So können Sie die Befehlsnummer in Ihrer Eingabeaufforderung anzeigen. Dies ist jedoch nicht die gleiche Nummer wie in der Verlaufsliste.
$: Setzt das letzte Zeichen der Eingabeaufforderung auf ein Dollarzeichen ($) für einen normalen Benutzer und ein Rautesymbol (#) für den Root-Benutzer. Dies wird durch die Überprüfung der UID des Benutzers ermöglicht. Wenn diese Null ist, ist der Benutzer der Root-Benutzer.
Die Definition Ihrer PS1
Umgebungsvariable finden Sie in Ihrer .bashrc
Datei.
Sitzungsumgebungsvariablen erstellen
Um Umgebungsvariablen für den persönlichen Gebrauch zu erstellen, fügen Sie diese am Ende Ihrer Datei .bashrc
hinzu. Wenn Sie die Variablen auch für Remote-Sitzungen wie SSH-Verbindungen verfügbar machen möchten, müssen Sie sie ebenfalls in der .bash_profile
Datei hinzufügen.
Das Format der Variablendefinition ist in beiden Dateien gleich. Um eine Definition in Ihrer .bash_profile
Datei hinzuzufügen, verwenden Sie folgenden Befehl:
gedit .bashrc
Hier wurde eine Umgebungsvariable namens INHERITED_VAR
hinzugefügt. Beachten Sie das Wort „export“ am Anfang der Zeile.
Nachdem Sie die Bearbeitung abgeschlossen haben, speichern und schließen Sie die Datei. Sie können sich ab- und wieder anmelden, oder Sie können die Shell veranlassen, die .bashrc
-Datei mit dem Punktbefehl (.) neu einzulesen:
. .bashrc
Lassen Sie uns nun eine Umgebungsvariable direkt in der Befehlszeile erstellen:
LOCAL_VAR="This session only"
Mit dem Befehl echo
können wir sehen, dass beide Variablen zugänglich sind:
echo $LOCAL_VAR
echo $INHERITED_VAR
Die Definition der Umgebungsvariable INHERITED_VAR
enthält das Wort „export“ am Anfang der Zeile. Dies bedeutet, dass die Variable an Kindprozesse der aktuellen Shell weitergegeben wird. Wenn wir mit dem Befehl bash
eine neue untergeordnete Shell starten, können wir die beiden Variablen erneut prüfen:
bash
echo $LOCAL_VAR
echo $INHERITED_VAR
Wie Sie sehen, ist INHERITED_VAR
in der untergeordneten Shell zugänglich, LOCAL_VAR
jedoch nicht. Wir erhalten hier lediglich eine Leerzeile.
Obwohl „export“ den Umgebungsvariablenteil der Umgebung hinzufügt, der an untergeordnete Prozesse vererbt wird, ist INHERITED_VAR
keine globale Umgebungsvariable. Der Benutzer „mary“ kann beispielsweise nicht darauf zugreifen:
echo $INHERITED_VAR
Um die untergeordnete Bash-Sitzung zu beenden, verwenden Sie den Befehl exit
:
exit
Vererbte Umgebungen beeinflussen auch Skripte. Hier ein einfaches Skript, das die Werte unserer drei Umgebungsvariablen in das Terminalfenster ausgibt:
#!/bin/bash echo "WEBSITE" $WEBSITE echo "LOCAL_VAR" $LOCAL_VAR echo "INHERITED_VAR" $INHERITED_VAR
Dieses Skript wurde in einer Datei namens envtest.sh
gespeichert und mit folgendem Befehl ausführbar gemacht:
chmod +x envtest.sh
Wenn wir das Skript ausführen, kann es auf zwei von drei Umgebungsvariablen zugreifen:
./envtest.sh
Das Skript kann die globale Umgebungsvariable WEBSITE
und die exportierte Variable INHERITED_VAR
sehen. LOCAL_VAR
ist nicht zugänglich, obwohl das Skript in der gleichen Shell ausgeführt wird, in der die Variable erstellt wurde.
Bei Bedarf können wir eine Umgebungsvariable auch über die Befehlszeile exportieren. Hierfür nutzen wir LOCAL_VAR
und führen das Skript dann erneut aus:
export LOCAL_VAR
./envtest.sh
Die Umgebungsvariable wurde nun der Umgebung der aktuellen Shell hinzugefügt und erscheint daher in der Umgebung, die das Skript erbt. Das Skript kann nun auch auf diese Variable zugreifen.
Remote-Verbindungen
Globale Umgebungsvariablen sind auch für Remote-Anmeldesitzungen verfügbar. Wenn Sie jedoch lokal definierte Umgebungsvariablen auch remote nutzen möchten, müssen Sie diese in Ihre Datei .bash_profile
aufnehmen. Es ist sogar möglich, dieselbe Variable mit unterschiedlichen Werten in den Dateien .bashrc
und .bash_profile
zu definieren. Ein Skript könnte dies nutzen, um beispielsweise sein Verhalten je nach lokalem oder Remote-Zugriff anzupassen.
Es gibt übrigens auch noch die Datei .profile
, die auch Umgebungsvariablendefinitionen enthalten kann. Allerdings wird die .profile
-Datei nicht berücksichtigt, wenn die Datei .bash_profile
existiert. Die sicherste und korrekte Vorgehensweise ist daher die Verwendung der .bash_profile
-Datei.
Um die Datei .bash_profile
zu bearbeiten, verwenden wir wieder gedit
:
gedit .bash_profile
Hier fügen wir dieselbe Umgebungsvariable mit demselben Wert hinzu, die wir zuvor verwendet haben.
Speichern Sie die Änderungen und schließen Sie gedit
.
Auf einem anderen Computer erstellen wir nun eine SSH Verbindung zum Testrechner.
ssh [email protected]
Sobald die Verbindung hergestellt ist, führen wir das Skript erneut aus:
./envtest.sh
Die Datei .bash_profile
wurde im Rahmen der Initialisierung des Remote-Logins gelesen, sodass die Umgebungsvariable INHERITED_VAR
sowohl für uns als auch für das Skript zugänglich ist.
Umgebungsvariable aufheben
Um eine Umgebungsvariable aufzuheben, verwenden Sie den Befehl unset
. Wenn wir die globale Umgebungsvariable WEBSITE
und die exportierte Variable INHERITED_VAR
aufheben, sind diese weder in der Befehlszeile noch in untergeordneten Prozessen verfügbar:
unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE
Beachten Sie, dass dies nur die Verfügbarkeit der globalen Variablen für Sie in der aktuellen Sitzung ändert. Eine andere Person, die gleichzeitig angemeldet ist, kann weiterhin auf ihre Instanz dieser globalen Variable zugreifen. Ihre Instanz wurde bei ihrer Anmeldung initialisiert und aus der Datei /etc/environment
gelesen und ist unabhängig von den Kopien der Variablen anderer Benutzer.
Als Beispiel kann der Benutzer „mary“ weiterhin auf die WEBSITE
Umgebungsvariable zugreifen und deren Wert lesen, obwohl der Benutzer „dave“ diese in seiner Sitzung deaktiviert hat:
echo $WEBSITE
Umgebungskontrolle
Umgebungsvariablen können verwendet werden, um Skripten und Anwendungen mitzuteilen, wie sie sich verhalten sollen. Sie dienen der Speicherung von Einstellungen oder kleineren Datenmengen. Beispielsweise könnte ein Skript eine Umgebung mit einem Wert füllen, auf den andere Skripte zugreifen können, ohne diesen in eine Datei schreiben zu müssen.