Linux · Tag 3 · Kapitel 05 von 6

Umgebungsvariablen & PATH

Warum findet die Shell ls, aber nicht mein_skript.sh? Antwort: $PATH. Heute lernst du, wie die Shell Befehle findet, wie du eigene Variablen setzt und warum .bashrc die wichtigste Datei deines Linux-Lebens wird.

📚 Kapitel 05 ⏱️ ca. 15 min Theorie + 30 min Lab 🧪 Lab 3.5
Inhalt dieses Kapitels
5.1

Was ist eine Umgebungsvariable?

Grundlage

Eine Variable ist ein Name, der einen Wert hält. Auf Linux gibt es zwei wichtige Arten:

SHELL-VARIABLE ┌─────────────────────────────────────────────┐ │ meine_variable="hallo" │ │ → Lebt NUR in deiner aktuellen Shell │ │ → Kind-Prozesse sehen sie NICHT │ └─────────────────────────────────────────────┘ UMGEBUNGS-VARIABLE (Environment Variable) ┌─────────────────────────────────────────────┐ │ export MEINE_VARIABLE="hallo" │ │ → Lebt in deiner Shell │ │ → Wird an ALLE Kind-Prozesse vererbt │ │ → Konvention: GROSSGESCHRIEBEN │ └─────────────────────────────────────────────┘
📌
Konvention: GROSSBUCHSTABEN

Umgebungsvariablen werden standardmäßig komplett großgeschrieben: PATH, HOME, USER, SHELL. Eigene Variablen für Skripte schreibst du meist kleingeschrieben: name, zaehler. Das hilft, sie optisch zu unterscheiden.

Die wichtigsten vordefinierten Variablen

VariableInhaltBeispiel
$HOMEdein Home-Verzeichnis/home/admin
$USERdein Login-Nameadmin
$SHELLwelche Shell läuft/bin/bash
$PATHwo Befehle gesucht werden/usr/local/bin:/usr/bin:/bin
$PWDaktuelles Verzeichnis/home/admin
$LANGSprache & Zeichensatzde_DE.UTF-8
$EDITORDefault-Editornano oder vim
5.2

Variablen lesen und setzen

Pflicht

Lesen

bash
# Den Wert einer Variable ausgeben — mit $
echo $HOME
# → /home/admin

echo $USER
# → admin

# Mit geschweiften Klammern (eindeutiger)
echo ${USER}
echo "Hallo, ${USER}!"   # → Hallo, admin!

# ALLE Umgebungsvariablen auflisten
env
# Oder:
printenv

# Eine bestimmte Variable suchen
env | grep PATH

Setzen

bash
# Shell-Variable (nur diese Shell)
name="Tim"
echo $name
# → Tim

# WICHTIG: KEINE Leerzeichen um das = !
name = "Tim"   # ← FALSCH! "name: command not found"
name="Tim"     # ← richtig

# Umgebungsvariable (auch für Kind-Prozesse)
export PROJEKT="hanovatech"
echo $PROJEKT
# → hanovatech

# Variable LÖSCHEN
unset name
echo $name
# → (leer)
🧠
export macht Variablen sichtbar

Ohne export sieht nur deine aktuelle Shell die Variable. Mit export sehen sie auch alle Programme, die du aus dieser Shell startest — z.B. Skripte. Faustregel: wenn ein Skript auf eine Variable zugreifen soll, muss sie exportiert sein.

▶ Test: Vererbung selbst nachprüfen
bash
# Shell-Variable (OHNE export)
test1="hallo"

# Neue Bash starten (Kind-Prozess)
bash

# Im Kind: Variable da?
echo $test1
# → (leer) — Kind sieht nichts!

# Zurück zum Eltern-Prozess
exit

# Jetzt mit export
export test2="hallo"
bash
echo $test2
# → hallo — Kind sieht es!
exit
5.3

$PATH — die wichtigste Variable

Pflicht

Wenn du ls tippst, woher weiß die Shell, wo /usr/bin/ls liegt? Antwort: aus $PATH.

$PATH ist eine Liste von Verzeichnissen, getrennt durch Doppelpunkte. Die Shell sucht in jedem dieser Verzeichnisse der Reihe nach nach dem getippten Befehl. Beim ersten Treffer ist Schluss.

bash
$ echo $PATH
/home/admin/.local/bin:/home/admin/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

So funktioniert die Suche

Du tippst: ls │ ▼ Shell schaut in $PATH der Reihe nach: 1. /home/admin/.local/bin/ls ← nein, gibt's nicht 2. /home/admin/bin/ls ← nein 3. /usr/local/bin/ls ← nein 4. /usr/bin/ls ← TREFFER! → ausführen │ ▼ Wenn nirgendwo gefunden: "ls: command not found"

Welcher Befehl wird ausgeführt? — which

bash
# Wo liegt der Befehl, der ausgeführt wird?
which ls
# → /usr/bin/ls

which dnf
# → /usr/bin/dnf

PATH erweitern

bash
# Neues Verzeichnis am ENDE anhängen
export PATH=$PATH:/home/admin/meine-skripte

# Neues Verzeichnis am ANFANG (höhere Priorität!)
export PATH=/home/admin/meine-skripte:$PATH

# Wichtig: NICHT überschreiben!
export PATH=/home/admin/meine-skripte
# ← FATAL! Du verlierst /usr/bin, /bin, alles!
# ls, cd, dnf — nichts geht mehr.
# Nur durch Neu-Login zu retten.
⚠️
PATH NIE überschreiben!

Immer erweitern mit $PATH:NEU oder NEU:$PATH. Wenn du export PATH=/etwas ohne das alte $PATH schreibst, verlierst du Zugriff auf alle normalen Befehle. Notfall-Rettung: Terminal schließen, neu öffnen — die .bashrc setzt PATH zurück.

5.4

Persistent mit .bashrc

Pflicht

Variablen, die du in der Shell setzt, sind weg, sobald du das Terminal schließt. Wenn sie jedes Mal beim Login da sein sollen, müssen sie in eine Startdatei:

DateiWann gelesenWofür
~/.bashrcbei jedem neuen Terminal-Fenster (interaktiv)Hier setzt du eigene Sachen!
▶ Bonus (optional) – Weitere Profile-Dateien (.bash_profile, /etc/profile, /etc/bashrc)
DateiWann gelesenWofür
~/.bash_profilenur beim LoginSelten gebraucht
/etc/profilebeim Login, für ALLE UserSystem-weite Defaults
/etc/bashrcbei jeder Bash, für ALLE UserSystem-weite Bash-Settings

Typische .bashrc-Erweiterungen

bash
# Datei öffnen
nano ~/.bashrc

# Am ENDE der Datei eintragen:

# Eigene Variablen
export EDITOR=nano

# Eigenes Skript-Verzeichnis im PATH
export PATH=$PATH:$HOME/skripte

# Aliase (Tipp-Abkürzungen)
alias ll='ls -la'
alias ..='cd ..'
alias df='df -h'

# Speichern (Strg+O, Enter, Strg+X)

# DAMIT ES SOFORT GREIFT — neu laden:
source ~/.bashrc
# oder kürzer:
. ~/.bashrc
▶ Warum $HOME statt ~ in PATH?

Die Tilde ~ ist eine Abkürzung der Shell für dein Home-Verzeichnis — aber sie wird nur an bestimmten Stellen ersetzt: am Anfang eines Wortes oder direkt nach einem Doppelpunkt in PATH-artigen Zuweisungen. In vielen anderen Zusammenhängen (etwa in Anführungszeichen oder mitten in einem Wort) bleibt sie einfach das Zeichen ~ stehen.

$HOME dagegen ist eine echte Variable, die überall zum vollen Pfad (/home/admin) expandiert — zuverlässig, egal an welcher Stelle. Deshalb ist export PATH=$PATH:$HOME/skripte die robustere Schreibweise: sie funktioniert sicher, auch wenn die Zeile später in einem Skript oder in Anführungszeichen landet.

Merksatz: ~ ist bequem zum Tippen auf der Kommandozeile — $HOME ist sicher zum Schreiben in Dateien.

💡
Aliase — kleine Welt, große Wirkung

Aliase sind Tipp-Abkürzungen. Ein ll statt ls -la spart 5 Anschläge — bei 100x am Tag sind das 500 Anschläge. Setz dir früh deine Lieblings-Aliase, und das Terminal wird zur zweiten Heimat.

📌
source vs. neues Terminal

Nachdem du .bashrc geändert hast, gilt das nicht automatisch in der laufenden Shell. Zwei Optionen:

  • source ~/.bashrc — lädt die Datei in die aktuelle Shell
  • Terminal schließen und neu öffnen — neuer Start, neue Variablen
🧪

Lab 3.5 — Deine Shell-Umgebung einrichten

Selbstständig · 30 min
📧
Mail von Markus Becker

Betreff: Richte dir deine Shell ein

Hi Tim,

du wirst die nächsten Monate viel Zeit im Terminal verbringen — richte es dir bequem ein. Drei Dinge solltest du können, bevor wir mit eigenen Skripten loslegen:

  • verstehen, welche Standard-Variablen dir die Shell schon mitgibt und wie du sie ausliest,
  • eine eigene Variable setzen und den Unterschied zwischen „nur in dieser Shell" und „auch in Kind-Prozessen" am eigenen Beispiel sehen,
  • einen eigenen Skript-Ordner so in den PATH hängen, dass er auch nach einem Neustart des Terminals noch da ist.

Probier's einfach aus — die genaue Umsetzung überlasse ich dir. — Markus

⚠️
Bevor du loslegst: Backup der .bashrc

In Phase 3 bearbeitest du deine ~/.bashrc. Mach dir gleich zu Beginn eine Sicherungskopie, dann kannst du jederzeit zurück: cp ~/.bashrc ~/.bashrc.backup. Falls du dir die Datei zerschießt, hilft dir das Backup (und im Notfall: Terminal schließen und neu öffnen).

Phase 1 — Standard-Variablen verstehen (8 min)
  1. Zeige die wichtigsten Umgebungsvariablen einzeln an: echo $HOME, echo $USER, echo $SHELL, echo $PWD.
  2. Liste ALLE Umgebungsvariablen mit env auf. Leite die Ausgabe an less weiter (q zum Beenden).
  3. Finde mit env | grep PATH die PATH-Variable. Wie viele Verzeichnisse sind drin? (Tipp: zähle die Doppelpunkte + 1)
  4. Wo liegt der ls-Befehl? Wo liegt sleep? (mit which). In welchem PATH-Verzeichnis stecken die?
bash
# 1) Einzelne Variablen
echo $HOME    # → /home/admin
echo $USER    # → admin
echo $SHELL   # → /bin/bash
echo $PWD     # → aktuelles Verzeichnis

# 2) Alle Umgebungsvariablen
env | less
# Mit q beenden

# 3) PATH finden
env | grep PATH
# Anzahl: einfach Doppelpunkte zählen + 1
# Oder programmatisch:
echo $PATH | tr ':' '\n' | wc -l

# 4) Wo liegen Befehle?
which ls      # → /usr/bin/ls
which sleep   # → /usr/bin/sleep
# Beide liegen in /usr/bin — und /usr/bin steht im PATH,
# darum findet die Shell sie ohne vollen Pfad.
Phase 2 — Eigene Variablen + PATH erweitern (12 min)
  1. Setze eine Shell-Variable mein_name mit deinem Vornamen. (Achtung: keine Leerzeichen um das =!)
  2. Gib sie aus: echo $mein_name. Klappt?
  3. Starte eine neue Bash mit bash. Gib darin echo $mein_name ein. Was passiert?
  4. Verlasse die innere Bash (exit). Mache jetzt export mein_name. Starte wieder bash und gib die Variable aus. Unterschied?
  5. Lösche die Variable mit unset mein_name und prüfe mit echo $mein_name.
  6. Erstelle einen Ordner für eigene Skripte: mkdir ~/skripte.
  7. Lege darin ein einfaches Skript an: echo 'echo "Hallo aus meinem Skript!"' > ~/skripte/hallo.sh und mache es ausführbar: chmod +x ~/skripte/hallo.sh.
  8. Versuche es direkt aufzurufen: hallo.sh. Was passiert?
  9. Erweitere PATH temporär: export PATH=$PATH:$HOME/skripte.
  10. Jetzt nochmal hallo.sh. Klappt es?
  11. Schließe das Terminal und öffne ein neues. Ist PATH noch erweitert?
bash
# 5) Shell-Variable setzen
mein_name="Tim"
# Achtung: KEINE Leerzeichen! mein_name = "Tim" geht NICHT

# 6) Ausgeben
echo $mein_name
# → Tim

# 7) Neue Bash → Variable nicht sichtbar
bash
echo $mein_name
# → (leer!) — Kind sieht Shell-Variable nicht
exit

# 8) Mit export sichtbar machen
export mein_name
bash
echo $mein_name
# → Tim — jetzt klappt's!
exit

# 9) Löschen
unset mein_name
echo $mein_name
# → (leer)

# 10) Ordner anlegen
mkdir ~/skripte

# 11) Mini-Skript
echo 'echo "Hallo aus meinem Skript!"' > ~/skripte/hallo.sh
chmod +x ~/skripte/hallo.sh

# 12) Direkt aufrufen — geht NICHT
hallo.sh
# → bash: hallo.sh: command not found
# Weil ~/skripte nicht im PATH ist!

# 13) PATH erweitern
export PATH=$PATH:$HOME/skripte

# 14) Nochmal — klappt!
hallo.sh
# → Hallo aus meinem Skript!

# 15) Neues Terminal → PATH weg
# Im neuen Terminal:
echo $PATH | grep skripte
# → (leer) — die Änderung war nur in der alten Shell
# Lösung: persistent in .bashrc speichern (Phase 3!)
Phase 3 — Persistent in .bashrc (10 min)
  1. Falls noch nicht geschehen: Backup machen (cp ~/.bashrc ~/.bashrc.backup).
  2. Öffne ~/.bashrc in nano. Geh ganz ans Ende.
  3. Trage am Ende ein:
    # Meine Erweiterungen
    export EDITOR=nano
    export PATH=$PATH:$HOME/skripte
    
    # Aliase
    alias ll='ls -la'
    alias ..='cd ..'
  4. Speichern (Strg+O, Enter, Strg+X).
  5. Lade die Datei neu: source ~/.bashrc.
  6. Teste: echo $EDITOR, hallo.sh, ll.
  7. Öffne ein NEUES Terminal und prüfe nochmal — sind die Variable und die Aliase auch dort?
bash
# 16) Backup
cp ~/.bashrc ~/.bashrc.backup

# 17) Datei öffnen
nano ~/.bashrc
# Mit Strg+End ans Ende springen

# 18) Am Ende einfügen (siehe Aufgabe)

# 19) Speichern: Strg+O, Enter, Strg+X

# 20) Neu laden
source ~/.bashrc

# 21) Testen
echo $EDITOR        # → nano
hallo.sh            # → Hallo aus meinem Skript!
ll                  # → ls -la-Ausgabe

# 22) Neues Terminal
# Alles immer noch da, weil .bashrc beim neuen Terminal gelesen wird!
🌟 Bonus für schnelle Teilnehmer
📌

Bonus: ein paar Komfort-Einstellungen, die fast jeder Admin früher oder später in seiner .bashrc hat.

  1. Farbige Standard-Befehle: Füge in der .bashrc hinzu: alias grep='grep --color=auto' und alias ls='ls --color=auto'. Damit hebt grep die Treffer farbig hervor und ls färbt Ordner, Dateien und Links unterschiedlich ein. Source und probier's aus.
  2. Längere Befehls-Geschichte: Setze in der .bashrc HISTSIZE=10000. Bash merkt sich damit deutlich mehr alte Befehle. Drücke danach in einem neuen Terminal Strg+R und tippe ein paar Buchstaben eines früheren Befehls — Bash sucht rückwärts durch die History und vervollständigt ihn. Mehrfaches Strg+R springt zu älteren Treffern, Enter führt aus, Strg+G bricht ab.
  3. Eigene Aliase entwerfen: Überleg dir zwei Befehle, die du heute besonders oft getippt hast, und bau dir dafür eigene Aliase (z.B. alias ll='ls -la'). Trag sie in die .bashrc ein, source neu und teste. Tipp: Mit alias (ohne Argumente) siehst du alle gerade aktiven Aliase.
🎉
Lab 3.5 geschafft?

Stark! Du hast jetzt eine eigene Shell-Umgebung — so wie jeder Admin sie sich nach und nach baut. Die .bashrc wächst über die Jahre und wird zu deinem persönlichen Werkzeug. Manche Admins kopieren sie sogar von Server zu Server — das ist quasi der digitale Fingerabdruck.

5.5

Typische Anfänger-Fehler

Vorsicht
Fehler 1 — Leerzeichen bei =

name = "Tim" ist FALSCH. Bash denkt, du willst den Befehl name mit den Argumenten = und "Tim" ausführen. Richtig: name="Tim" — direkt aneinander, kein Leerzeichen.

Fehler 2 — PATH überschreiben statt erweitern

export PATH=/meine-skripte ohne :$PATH → alle anderen Verzeichnisse weg. Plötzlich gehen ls, dnf usw. nicht mehr. Notfall-Rettung: Terminal schließen, neu öffnen — die .bashrc setzt PATH neu. Immer: export PATH=$PATH:NEU.

Fehler 3 — Vergessen, source zu machen

Du änderst .bashrc, sparst dir das neue Terminal — und wunderst dich, warum die Änderungen nicht greifen. Lösung: source ~/.bashrc in der aktuellen Shell, oder neues Terminal öffnen.

Fehler 4 — export vergessen

Variable in der Shell gesetzt, aber Skript sieht sie nicht? Wahrscheinlich fehlt export. Ohne export bleibt sie in der aktuellen Shell. Faustregel: wenn ein Skript drauf zugreifen soll → export.

🎯

Kontrollfragen zum Kapitel

Selbst-Check
  1. Was ist der Unterschied zwischen einer Shell-Variable und einer exportierten (Umgebungs-)Variable?
  2. Du tippst which sleep. Was sagt dir die Ausgabe — und warum findet die Shell den Befehl überhaupt, ohne dass du den vollen Pfad angibst?
  3. Was ist der KRITISCHE Unterschied zwischen export PATH=$PATH:/neu und export PATH=/neu?
  4. In welcher Datei trägst du Variablen, Aliase und PATH-Erweiterungen ein, damit sie bei JEDEM neuen Terminal automatisch da sind?
  5. Was ist an MEINNAME = Tim falsch — und wie schreibt man es richtig?
  6. Du hast deine .bashrc geändert, aber in der laufenden Shell tut sich nichts. Was tust du?
  1. Eine Shell-Variable kennt nur die aktuelle Shell — Kind-Prozesse (z.B. Skripte oder eine neue bash) sehen sie nicht. Mit export wird sie zur Umgebungsvariable und damit an alle Kind-Prozesse vererbt.
  2. which sleep gibt den vollen Pfad aus, z.B. /usr/bin/sleep. Die Shell findet den Befehl, weil /usr/bin in $PATH steht — sie sucht den Namen der Reihe nach in allen PATH-Verzeichnissen ab.
  3. Variante 1 erweitert PATH (sicher) — die alten Verzeichnisse bleiben drin. Variante 2 überschreibt PATH komplett: ls, dnf & Co. werden nicht mehr gefunden. Rettung: Terminal neu öffnen.
  4. ~/.bashrc — wird bei jedem interaktiven Terminal gelesen.
  5. Die Leerzeichen um das = sind falsch. Bash hält MEINNAME dann für einen Befehl. Richtig: MEINNAME=Tim — direkt aneinander, ohne Leerzeichen.
  6. source ~/.bashrc (lädt die Datei in die laufende Shell) — oder einfach ein neues Terminal öffnen.