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.

VariableTypische BedeutungBeispielwertHinweis
HOMEHome-Verzeichnis/home/aliceBenutzerabhängig
PATHSuchpfade für ausführbare Befehle/usr/local/bin:/usr/binEinträge sind durch Doppelpunkte getrennt
USERAktueller BenutzernamealiceKann von der tatsächlichen Identität eines Prozesses abweichen
SHELLBevorzugte Login-Shell/bin/bashNicht jede gestartete Shell muss dieser Wert sein
LANGSprache und Gebietsschemade_DE.UTF-8Beeinflusst unter anderem Übersetzungen und Sortierung
TERMArt des Terminalfenstersxterm-256colorWichtig für die Darstellung von Terminalausgaben
PWDAktuelles Arbeitsverzeichnis/home/alice/projektWird 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.

MethodeGültigkeitFür Kindprozesse verfügbarNach neuem Terminal noch vorhanden
VAR1=exampleAktuelle ShellNeinNein
export VAR1=exampleAktuelle Shell und deren später gestartete KinderJaNein, sofern nicht in einer Startdatei gespeichert
VAR1=example befehlNur für diesen ProgrammaufrufJa, für diesen AufrufNein
Eintrag in ~/.bashrc oder einer passenden StartdateiNach dem Einlesen in künftigen SitzungenJa, abhängig von der SitzungsartJa, für passende Sitzungen
Systemweite KonfigurationFür betroffene Benutzer und SitzungenJaJa, 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 OrtGeltungsbereichTypischer EinsatzWichtige Einschränkung
~/.bashrcAktueller BenutzerInteraktive Bash-ShellsNicht jede Login- oder grafische Sitzung liest sie ein
~/.bash_profileAktueller BenutzerLogin-Bash-ShellsKann je nach Inhalt weitere Dateien einlesen
~/.profileAktueller BenutzerLogin- oder AnmeldesitzungenVerhalten hängt von Distribution und Sitzungsstart ab
/etc/environmentSystemweit beziehungsweise anmeldebezogenEinfache systemweite VariablenKeine normale Shell-Skriptdatei; Syntaxregeln beachten
/etc/profile.d/Systemweite Shell-KonfigurationZusätzliche Skripte für Login-ShellsAdministrativer 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 $VAR1 oder 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.