linux-cli-shell cli shell scripting environment variables fundamentals

Environment Variables: PATH & HOME (Artikel 289)

Verständnis der Umgebungsvariablen unter Linux. Erfahren Sie alles über den Suchpfad PATH, Home-Verzeichnisse und die persistente Konfiguration von Systemvariablen.

# Environment Variables: Das Gedächtnis Ihrer Shell

TL;DR / Management Summary Ohne Umgebungsvariablen wäre Linux unbedienbar. Variablen wie $PATH entscheiden, ob Sie einen Befehl durch Tippen des Namens oder nur durch den vollen Pfad aufrufen können. $HOME und $USER definieren Ihre Identität im System. Ein Senior Admin muss wissen, wie er Variablen sicher setzt, wie sie an Kind-Prozesse vererbt werden und wo er systemweite Standards definiert, die für alle Benutzer gelten.


# 1. Einführung & Architektur

Vererbung und Export.

  • Shell Variable: Existiert nur in der aktuellen Shell-Instanz.
  • Environment Variable: Wird mit export markiert und an jeden Kind-Prozess (Subshell, Programm) weitergereicht.

# Die Variablen-Hierarchie (Mermaid)

graph TD
    A[Parent Shell: Bash] -->|export NAME=val| B[Child Process: Script]
    A -->|VAR=val| C[Local memory only]
    B -->|Inherit| D[Sub-Child: curl/ssh]
    subgraph "Standard Variables"
        E[PATH: Search list]
        F[HOME: User Root]
        G[LANG: Encoding]
    end
    A --- E
    A --- F
    A --- G

# 2. Die wichtigsten Systemvariablen

Die ‘Big Four’.

  1. $PATH: Eine durch Doppelpunkt getrennte Liste von Verzeichnissen. Hier sucht die Shell nach ausführbaren Dateien.
  2. $HOME: Der Pfad zum Home-Verzeichnis des aktuellen Benutzers.
  3. $USER: Der Login-Name des Benutzers.
  4. $PWD: Das aktuelle Arbeitsverzeichnis (Print Working Directory).

# Den Pfad erweitern (Best Practice)

# Fügt ~/bin am Anfang des Pfades hinzu (höchste Priorität)
export PATH="$HOME/bin:$PATH"

# 3. Persistenz: Wo werden Variablen gespeichert?

Damit sie den Reboot überleben.

Ort Geltungsbereich Wann genutzt?
/etc/environment Systemweit Für alle Logins (einfache Key=Value Syntax).
/etc/profile Systemweit Für alle interaktiven Login-Shells.
~/.profile Benutzerspezifisch Für Ihre eigene Login-Sitzung.
~/.bashrc Benutzerspezifisch Für jede interaktive Shell (ideal für Aliase).

# 4. Day-2 Operations: Variablen im Skripting

Sicherer Umgang.

# Fallback-Werte nutzen

Wenn eine Variable nicht gesetzt ist, nutzen wir einen Standardwert:

LOG_DIR="${LOG_VAR:-/var/log/myapp}"

# Variablen verstecken (Security)

Geben Sie niemals Passwörter in Umgebungsvariablen weiter, die in der Prozessliste (ps) sichtbar sein könnten. Nutzen Sie stattdessen read oder File-Inputs.


# 5. Troubleshooting & “War Stories”

Wenn der Pfad in die Irre führt.

# Story 1: “Der falsche Compiler”

Symptom: Ein Admin installiert eine neue Version von Java, aber java -version zeigt immer noch die alte Version an. Ursache: Der Pfad zur alten Version steht im $PATH weiter vorne als der Pfad zur neuen Version. Lösung: Prüfen Sie die Reihenfolge mit echo $PATH. Platzieren Sie die neue Version an den Anfang des Strings oder nutzen Sie update-alternatives.

# Story 2: “Variablenverlust bei Sudo”

Symptom: Ein User setzt export MY_API_KEY=123. Er führt ein Skript mit sudo ./script.sh aus, aber der Key ist im Skript leer. Ursache: Sudo setzt aus Sicherheitsgründen die Umgebung zurück (env_reset). Lösung: Nutzen Sie sudo -E ./script.sh (Preserve Environment) oder konfigurieren Sie keep_env in der /etc/sudoers.


# 6. Fazit & Empfehlung

  • Export: Vergessen Sie niemals das export, wenn eine Variable in einem Skript verfügbar sein soll, das Sie gerade starten.
  • Debugging: Nutzen Sie env oder printenv, um alle aktuell gesetzten Umgebungsvariablen zu sehen.
  • Wahl: Nutzen Sie /etc/environment für einfache Variablen ohne Logik und /etc/profile.d/ für komplexe Pfad-Berechnungen.

# Anhang: Cheatsheet

Aufgabe Befehl
Alle Variablen sehen env
Eine Variable sehen echo $VARIABLE
Variable exportieren export NAME="Value"
Variable löschen unset NAME
Pfad temporär ändern PATH=/tmp:$PATH ./binary
Letzter Befehl Status $?
Shell PID $$
Sprache ändern export LANG=en_US.UTF-8
Editor festlegen export EDITOR=vim