Inhalt dieses Kapitels
Was ist eine Umgebungsvariable?
GrundlageEine Variable ist ein Name, der einen Wert hält. Auf Linux gibt es zwei wichtige Arten:
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
| Variable | Inhalt | Beispiel |
|---|---|---|
$HOME | dein Home-Verzeichnis | /home/admin |
$USER | dein Login-Name | admin |
$SHELL | welche Shell läuft | /bin/bash |
$PATH | wo Befehle gesucht werden | /usr/local/bin:/usr/bin:/bin |
$PWD | aktuelles Verzeichnis | /home/admin |
$LANG | Sprache & Zeichensatz | de_DE.UTF-8 |
$EDITOR | Default-Editor | nano oder vim |
Variablen lesen und setzen
PflichtLesen
# 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
# 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 sichtbarOhne 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
# 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
$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.
$ echo $PATH
/home/admin/.local/bin:/home/admin/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
So funktioniert die Suche
Welcher Befehl wird ausgeführt? — which
# Wo liegt der Befehl, der ausgeführt wird?
which ls
# → /usr/bin/ls
which dnf
# → /usr/bin/dnf
PATH erweitern
# 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.
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.
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:
| Datei | Wann gelesen | Wofür |
|---|---|---|
~/.bashrc | bei jedem neuen Terminal-Fenster (interaktiv) | Hier setzt du eigene Sachen! |
▶ Bonus (optional) – Weitere Profile-Dateien (.bash_profile, /etc/profile, /etc/bashrc)
| Datei | Wann gelesen | Wofür |
|---|---|---|
~/.bash_profile | nur beim Login | Selten gebraucht |
/etc/profile | beim Login, für ALLE User | System-weite Defaults |
/etc/bashrc | bei jeder Bash, für ALLE User | System-weite Bash-Settings |
Typische .bashrc-Erweiterungen
# 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 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 TerminalNachdem 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 minBetreff: 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
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).
- Zeige die wichtigsten Umgebungsvariablen einzeln an:
echo $HOME,echo $USER,echo $SHELL,echo $PWD. - Liste ALLE Umgebungsvariablen mit
envauf. Leite die Ausgabe anlessweiter (q zum Beenden). - Finde mit
env | grep PATHdie PATH-Variable. Wie viele Verzeichnisse sind drin? (Tipp: zähle die Doppelpunkte + 1) - Wo liegt der
ls-Befehl? Wo liegtsleep? (mitwhich). In welchem PATH-Verzeichnis stecken die?
# 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.
- Setze eine Shell-Variable
mein_namemit deinem Vornamen. (Achtung: keine Leerzeichen um das =!) - Gib sie aus:
echo $mein_name. Klappt? - Starte eine neue Bash mit
bash. Gib darinecho $mein_nameein. Was passiert? - Verlasse die innere Bash (
exit). Mache jetztexport mein_name. Starte wiederbashund gib die Variable aus. Unterschied? - Lösche die Variable mit
unset mein_nameund prüfe mitecho $mein_name. - Erstelle einen Ordner für eigene Skripte:
mkdir ~/skripte. - Lege darin ein einfaches Skript an:
echo 'echo "Hallo aus meinem Skript!"' > ~/skripte/hallo.shund mache es ausführbar:chmod +x ~/skripte/hallo.sh. - Versuche es direkt aufzurufen:
hallo.sh. Was passiert? - Erweitere PATH temporär:
export PATH=$PATH:$HOME/skripte. - Jetzt nochmal
hallo.sh. Klappt es? - Schließe das Terminal und öffne ein neues. Ist PATH noch erweitert?
# 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!)
- Falls noch nicht geschehen: Backup machen
(
cp ~/.bashrc ~/.bashrc.backup). - Öffne
~/.bashrcin nano. Geh ganz ans Ende. - Trage am Ende ein:
# Meine Erweiterungen export EDITOR=nano export PATH=$PATH:$HOME/skripte # Aliase alias ll='ls -la' alias ..='cd ..' - Speichern (Strg+O, Enter, Strg+X).
- Lade die Datei neu:
source ~/.bashrc. - Teste:
echo $EDITOR,hallo.sh,ll. - Öffne ein NEUES Terminal und prüfe nochmal — sind die Variable und die Aliase auch dort?
# 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: ein paar Komfort-Einstellungen, die fast
jeder Admin früher oder später in seiner .bashrc hat.
- Farbige Standard-Befehle: Füge in der
.bashrchinzu:alias grep='grep --color=auto'undalias ls='ls --color=auto'. Damit hebtgrepdie Treffer farbig hervor undlsfärbt Ordner, Dateien und Links unterschiedlich ein. Source und probier's aus. - Längere Befehls-Geschichte: Setze in der
.bashrcHISTSIZE=10000. Bash merkt sich damit deutlich mehr alte Befehle. Drücke danach in einem neuen TerminalStrg+Rund tippe ein paar Buchstaben eines früheren Befehls — Bash sucht rückwärts durch die History und vervollständigt ihn. MehrfachesStrg+Rspringt zu älteren Treffern,Enterführt aus,Strg+Gbricht ab. - 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.bashrcein, source neu und teste. Tipp: Mitalias(ohne Argumente) siehst du alle gerade aktiven Aliase.
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.
Typische Anfänger-Fehler
Vorsicht=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.
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.
source zu machenDu ä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.
export vergessenVariable 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- Was ist der Unterschied zwischen einer Shell-Variable und einer exportierten (Umgebungs-)Variable?
- Du tippst
which sleep. Was sagt dir die Ausgabe — und warum findet die Shell den Befehl überhaupt, ohne dass du den vollen Pfad angibst? - Was ist der KRITISCHE Unterschied zwischen
export PATH=$PATH:/neuundexport PATH=/neu? - In welcher Datei trägst du Variablen, Aliase und PATH-Erweiterungen ein, damit sie bei JEDEM neuen Terminal automatisch da sind?
- Was ist an
MEINNAME = Timfalsch — und wie schreibt man es richtig? - Du hast deine
.bashrcgeändert, aber in der laufenden Shell tut sich nichts. Was tust du?
- Eine Shell-Variable kennt nur die aktuelle
Shell — Kind-Prozesse (z.B. Skripte oder eine neue
bash) sehen sie nicht. Mitexportwird sie zur Umgebungsvariable und damit an alle Kind-Prozesse vererbt. which sleepgibt den vollen Pfad aus, z.B./usr/bin/sleep. Die Shell findet den Befehl, weil/usr/binin$PATHsteht — sie sucht den Namen der Reihe nach in allen PATH-Verzeichnissen ab.- 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. ~/.bashrc— wird bei jedem interaktiven Terminal gelesen.- Die Leerzeichen um das
=sind falsch. Bash hältMEINNAMEdann für einen Befehl. Richtig:MEINNAME=Tim— direkt aneinander, ohne Leerzeichen. source ~/.bashrc(lädt die Datei in die laufende Shell) — oder einfach ein neues Terminal öffnen.