VMware ESXi and vSphere Cluster Management
Was sind Umgebungsvariablen in Linux?
Umgebungsvariablen in Linux verständlich erklärt: HOME, PATH, export, Shell-Variablen, Gültigkeitsbereiche, Startdateien und sichere Praxisbeispiele.
Umgebungsvariablen sind benannte Werte, über die ein Prozess Informationen über seine Laufzeitumgebung erhält. Dazu gehören zum Beispiel das Home-Verzeichnis eines Benutzers, die Sprache der Sitzung oder die Verzeichnisse, in denen nach Befehlen gesucht wird.
Sie sind besonders nützlich, weil Programme dadurch an unterschiedliche Benutzer, Sitzungen und Systeme angepasst werden können, ohne dass benutzerspezifische Pfade oder Einstellungen fest im Programmcode stehen müssen.
Was ist eine Umgebungsvariable?
Eine Umgebungsvariable besteht aus einem Namen und einem Wert. Der Name wird meistens großgeschrieben, zum Beispiel HOME oder PATH. Der Wert kann je nach Benutzer, Sitzung oder System unterschiedlich sein.
Ein Programm kann den Wert beim Start aus seiner Prozessumgebung lesen. Ein Texteditor kann etwa HOME verwenden, um die persönlichen Konfigurationsdateien eines Benutzers zu finden. Ein Befehl wie ls wird über PATH gefunden, ohne dass der vollständige Pfad eingegeben werden muss.
Benutzerspezifische Werte: HOME
HOME enthält normalerweise den Pfad zum Home-Verzeichnis des aktuell angemeldeten Benutzers. Für zwei Benutzer kann die Variable daher unterschiedliche Werte haben:
alice$ echo "$HOME"
/home/alice
bob$ echo "$HOME"
/home/bob
Programme müssen dadurch nicht fest an /home/alice oder einen anderen konkreten Benutzernamen gebunden sein. Sie können persönliche Dateien und Konfigurationen relativ zu $HOME suchen.
| Variable | Typische Bedeutung | Beispielwert | Hinweis |
|---|---|---|---|
| HOME | Home-Verzeichnis | /home/alice | Benutzerabhängig |
| PATH | Suchpfade für ausführbare Befehle | /usr/local/bin:/usr/bin | Einträge sind durch Doppelpunkte getrennt |
| USER | Aktueller Benutzername | alice | Kann von der tatsächlichen Identität eines Prozesses abweichen |
| SHELL | Bevorzugte Login-Shell | /bin/bash | Nicht jede gestartete Shell muss dieser Wert sein |
| LANG | Sprache und Gebietsschema | de_DE.UTF-8 | Beeinflusst unter anderem Übersetzungen und Sortierung |
| TERM | Art des Terminalfensters | xterm-256color | Wichtig für die Darstellung von Terminalausgaben |
| PWD | Aktuelles Arbeitsverzeichnis | /home/alice/projekt | Wird von der Shell aktualisiert |
Vorhandene Umgebungsvariablen anzeigen
Mit env lässt sich die Umgebung anzeigen, die für die aktuelle Shell beziehungsweise für einen von ihr gestarteten Prozess verfügbar ist:
env
printenv gibt ebenfalls exportierte Umgebungsvariablen aus. Ohne Argument zeigt es alle passenden Variablen an; mit einem Namen wird nur dieser Wert ausgegeben:
printenv
printenv HOME
printenv PATH
Für eine gezielte Ausgabe kann die Shell eine Variablenreferenz expandieren. Bei der Variablenexpansion ersetzt die Shell $NAME durch den zugehörigen Wert:
echo "$HOME"
echo "${HOME}"
Die Anführungszeichen verhindern, dass Leerzeichen oder bestimmte Sonderzeichen im Wert unerwartet von der Shell verarbeitet werden.
Shell-Variablen und Umgebungsvariablen
Eine Zuweisung wie VAR1=example erzeugt zunächst eine Shell-Variable. Sie ist in der laufenden Shell verfügbar:
VAR1=example
echo "$VAR1"
Ein aus dieser Shell gestartetes Programm erhält diese Variable jedoch erst, wenn sie exportiert wurde. Der Befehl export nimmt die Shell-Variable in die Umgebung nachfolgender Kindprozesse auf.
VAR1=example
export VAR1
printenv VAR1
Die Kurzform setzt und exportiert die Variable in einem Schritt:
export VAR1=example
echo "$VAR1"
Ein Kindprozess ist ein Programm oder eine weitere Shell, das beziehungsweise die von einem bestehenden Prozess gestartet wird. Die Vererbung läuft vom Elternprozess zum Kindprozess:
export VAR1=example
sh -c 'printenv VAR1'
Die exportierte Variable wird beim Start an den Kindprozess übergeben. Bereits laufende Prozesse erhalten eine spätere Änderung nicht automatisch rückwirkend. Sie müssen in der Regel neu gestartet werden, damit sie den neuen Wert bekommen.
Zuweisung und Variablenreferenz
Um eine Variable zu setzen, stehen keine Leerzeichen um das Gleichheitszeichen:
VAR1=example
export VAR1=example
Leerzeichen würden dazu führen, dass die Shell die Eingabe anders interpretiert. Diese Schreibweise ist falsch:
export VAR1 = example
Zum Auslesen wird das Dollarzeichen verwendet:
echo "$VAR1"
Die Klammerform ${VAR1} grenzt den Namen eindeutig ab, wenn direkt weiterer Text folgt:
NAME=linux
echo "Willkommen bei ${NAME}Grundlagen"
echo "Datei: ${HOME}/notizen.txt"
Werte mit Leerzeichen oder Sonderzeichen sollten in Anführungszeichen gesetzt werden:
GREETING="Hallo Linux"
export GREETING
Gültigkeitsbereich und Lebensdauer
Eine interaktiv gesetzte Variable gehört normalerweise nur zur aktuellen Shell-Sitzung. Wird das Terminal geschlossen, endet diese Shell und die manuell gesetzte Variable geht verloren. Ein neues Terminal startet üblicherweise eine neue Shell, in der der Wert nicht vorhanden ist.
| Methode | Gültigkeit | Für Kindprozesse verfügbar | Nach neuem Terminal noch vorhanden |
|---|---|---|---|
VAR1=example | Aktuelle Shell | Nein | Nein |
export VAR1=example | Aktuelle Shell und deren später gestartete Kinder | Ja | Nein, sofern nicht in einer Startdatei gespeichert |
VAR1=example befehl | Nur für diesen Programmaufruf | Ja, für diesen Aufruf | Nein |
Eintrag in ~/.bashrc oder einer passenden Startdatei | Nach dem Einlesen in künftigen Sitzungen | Ja, abhängig von der Sitzungsart | Ja, für passende Sitzungen |
| Systemweite Konfiguration | Für betroffene Benutzer und Sitzungen | Ja | Ja, abhängig von der Konfiguration |
Nur einen einzelnen Befehl beeinflussen
Eine Zuweisung direkt vor einem Befehl gilt nur für dessen Prozessumgebung:
VAR1=example printenv VAR1
echo "$VAR1"
Die erste Zeile gibt example aus. Die zweite Zeile zeigt danach keinen gesetzten Wert, weil die Zuweisung nicht dauerhaft in der aktuellen Shell gespeichert wurde.
Umgebungsvariablen dauerhaft setzen
Für dauerhafte Einstellungen wird eine Shell-Startdatei verwendet. Eine Shell-Startdatei ist eine Konfigurationsdatei, die beim Start bestimmter Shell-Sitzungen eingelesen wird.
| Datei oder Ort | Geltungsbereich | Typischer Einsatz | Wichtige Einschränkung |
|---|---|---|---|
~/.bashrc | Aktueller Benutzer | Interaktive Bash-Shells | Nicht jede Login- oder grafische Sitzung liest sie ein |
~/.bash_profile | Aktueller Benutzer | Login-Bash-Shells | Kann je nach Inhalt weitere Dateien einlesen |
~/.profile | Aktueller Benutzer | Login- oder Anmeldesitzungen | Verhalten hängt von Distribution und Sitzungsstart ab |
/etc/environment | Systemweit beziehungsweise anmeldebezogen | Einfache systemweite Variablen | Keine normale Shell-Skriptdatei; Syntaxregeln beachten |
/etc/profile.d/ | Systemweite Shell-Konfiguration | Zusätzliche Skripte für Login-Shells | Administrativer Zugriff erforderlich; nicht automatisch für jede grafische Anwendung |
Für eine interaktive Bash-Sitzung kann eine benutzerspezifische Variable beispielsweise in ~/.bashrc eingetragen werden:
printf '\nexport VAR1="example"\n' >> ~/.bashrc
source ~/.bashrc
printenv VAR1
source liest die Datei in der aktuellen Shell erneut ein. Alternativ kann eine neue Sitzung gestartet werden. Welche Datei richtig ist, hängt davon ab, ob eine interaktive Shell, eine Login-Shell oder eine grafische Sitzung konfiguriert werden soll.
Systemweite Shell-Einstellungen können Administratoren beispielsweise in einer Datei unter /etc/profile.d/ hinterlegen:
export VAR1="example"
Startdateien sind für alle Programme relevant, die sie tatsächlich einlesen oder deren Umgebung von einem entsprechend gestarteten Prozess erben. Deshalb ist ~/.bashrc nicht automatisch die richtige Stelle für jede grafische Anwendung.
Variablen löschen
Mit unset NAME wird eine Variable aus der aktuellen Shell entfernt:
unset VAR1
echo "${VAR1:-nicht gesetzt}"
Danach ist VAR1 in dieser Shell nicht mehr über $VAR1 verfügbar. Neu gestartete Kindprozesse erben sie ebenfalls nicht. Ein bereits laufender Prozess, der den alten Wert beim Start erhalten hat, wird dadurch nicht nachträglich verändert.
Die PATH-Umgebungsvariable
PATH ist eine durch Doppelpunkte getrennte Liste von Verzeichnissen. Wenn ein Befehl ohne vollständigen Pfad eingegeben wird, durchsucht die Shell diese Verzeichnisse in der angegebenen Reihenfolge.
echo "$PATH"
# Beispiel:
# /usr/local/bin:/usr/bin:/bin
Existiert ein gleichnamiger ausführbarer Befehl in mehreren Verzeichnissen, wird normalerweise der Treffer aus dem zuerst passenden Verzeichnis verwendet. Die Reihenfolge beeinflusst somit, welches Programm ausgeführt wird.
PATH temporär erweitern
Ein eigenes Programmverzeichnis kann für die aktuelle Shell und ihre später gestarteten Prozesse angehängt werden:
export PATH="$PATH:$HOME/bin"
echo "$PATH"
Der vorhandene Wert bleibt durch $PATH: erhalten. Für eine dauerhafte Einstellung kann die Export-Anweisung in eine passende Startdatei eingetragen werden, zum Beispiel:
export PATH="$PATH:$HOME/bin"
Ein Verzeichnis kann auch an den Anfang gesetzt werden:
export PATH="$HOME/bin:$PATH"
Das kann gewollt sein, wenn eigene Programme Vorrang haben sollen. Es erhöht aber die Bedeutung der Dateien in diesem Verzeichnis.
Fehlerbehebung
Eine Variable ist in einem Skript oder Programm leer
Wahrscheinliche Ursache: Die Variable wurde nur als Shell-Variable gesetzt und nicht exportiert.
echo "$VAR1"
printenv VAR1
export VAR1
printenv VAR1
Wenn die Shell den Wert kennt, printenv ihn aber nicht ausgibt, fehlt meist export.
Die Variable fehlt nach dem Öffnen eines neuen Terminals
Die Zuweisung galt wahrscheinlich nur für die vorherige Shell. Prüfe zunächst den aktuellen Wert:
echo "${VAR1:-nicht gesetzt}"
Für künftige passende Sitzungen wird die Export-Anweisung in eine geeignete Startdatei geschrieben. Danach kann die Datei mit source erneut eingelesen oder eine neue Sitzung gestartet werden.
Fehler bei einer export-Zuweisung
Die Schreibweise mit Leerzeichen ist falsch:
export VAR1 = example
Richtig ist:
export VAR1=example
Ein Befehl wird nach einer PATH-Änderung nicht gefunden
Prüfe den PATH, die Befehlsauflösung und die Datei:
echo "$PATH"
command -v befehlsname
ls -l "$HOME/bin/befehlsname"
Das Zielverzeichnis muss tatsächlich in PATH stehen, die Datei muss vorhanden und ausführbar sein, und die Änderung muss in der aktiven Shell geladen worden sein.
Nach einer PATH-Änderung läuft der falsche Befehl
Ein gleichnamiges Programm steht vermutlich in einem früheren PATH-Verzeichnis. Die folgenden Befehle zeigen die Auswahl und weitere Treffer:
command -v befehlsname
type -a befehlsname
Passe die Reihenfolge bewusst an und vermeide unsichere Einträge wie das aktuelle Verzeichnis.
Eine Variable funktioniert in einer grafischen Anwendung nicht
Die Variable wurde möglicherweise nur in einer Datei für interaktive Shells gesetzt. Grafische Sitzungen lesen ~/.bashrc nicht zwingend ein.
Prüfe die verwendete Sitzungs- und Shell-Art und wähle eine dafür geeignete Konfiguration. Ein Eintrag in einer Shell-Startdatei ist nicht automatisch für alle Prozesse der grafischen Sitzung sichtbar.
Prüfungsrelevante Zusammenfassung
- Umgebungsvariable: Benannter Wert in der Umgebung eines Prozesses.
- Shell-Variable: Zunächst nur in der laufenden Shell verfügbar.
- export: Macht eine Shell-Variable für neu gestartete Kindprozesse verfügbar.
- Zuweisung: Keine Leerzeichen um das Gleichheitszeichen, also
VAR1=example. - Referenz: Werte werden mit
$VAR1oder eindeutig mit${VAR1}gelesen. - HOME: Pfad zum Home-Verzeichnis des aktuellen Benutzers.
- PATH: Geordnete, durch Doppelpunkte getrennte Liste von Suchverzeichnissen.
- Gültigkeit: Interaktiv gesetzte Variablen verschwinden normalerweise mit der Shell.
- Dauerhaftigkeit: Dafür sind passende Benutzer- oder System-Startdateien nötig.
- unset: Entfernt eine Variable aus der aktuellen Shell und ihrer künftigen Umgebung.
Weiterführendes Thema
Die Grundlagen lassen sich mit Umgebungsvariablen in Linux wiederholen und anschließend auf Bash-Skripte, Prozesse und Dateiberechtigungen übertragen.