Skip to main content

10.1 Shell, Pipes und Umleitungen

Die Shell ist eines der wichtigsten Werkzeuge unter Linux.

Sie nimmt Befehle entgegen, führt sie aus und kann Ausgaben, Eingaben und Fehlermeldungen gezielt weiterleiten.

Besonders wichtig sind dabei:

- Pipes
- Umleitungen
- Wildcards
- Variablen
- Befehlsverkettung
- Exit-Codes
- einfache Filterbefehle

Für Fachinformatiker Systemintegration ist dieses Thema wichtig, weil viele administrative Aufgaben unter Linux aus mehreren kleinen Befehlen bestehen, die miteinander kombiniert werden.

Merksatz:

Die Stärke der Shell liegt darin,
einfache Werkzeuge sinnvoll zu kombinieren.

Lernziele

Nach dieser Seite solltest du erklären können:

- was eine Shell ist
- was Bash ist
- was Standardausgabe,
  Standardeingabe
  und Standardfehler sind
- was Pipes machen
- wie Umleitungen funktionieren
- was >,
  >>,
  <,
  2>
  und &> bedeuten
- wie man Befehle verkettet
- was Exit-Codes sind
- wie man grep,
  sort,
  uniq,
  wc,
  cut
  und tee sinnvoll nutzt

Grundidee

Unter Linux geben viele Befehle Text aus.

Diese Ausgabe kann man:

- anzeigen
- filtern
- speichern
- an andere Befehle weitergeben
- in Dateien schreiben
- zählen
- sortieren
- durchsuchen

Beispiel:

ps aux | grep nginx

Bedeutung:

ps aux zeigt Prozesse.

grep nginx filtert nur Zeilen mit nginx.

Merksatz:

Befehle können ihre Ausgabe an andere Befehle weitergeben.

Shell

Eine Shell ist ein Befehlsinterpreter.

Sie verarbeitet eingegebene Befehle und startet Programme.

Bekannte Shells:

Shell Bedeutung
sh klassische Unix-Shell
bash Bourne Again Shell
zsh moderne interaktive Shell
fish benutzerfreundliche Shell

Viele Linux-Systeme nutzen Bash als Standardshell.

Merksatz:

Shell = Befehlsinterpreter.

Bash

Bash steht für:

Bourne Again Shell

Bash kann:

- Befehle ausführen
- Variablen verwenden
- Ausgaben umleiten
- Pipes nutzen
- Bedingungen auswerten
- Schleifen ausführen
- Skripte starten

Beispiel:

echo "Hallo Linux"

Merksatz:

Bash ist Shell und Skriptumgebung.

Prompt

Der Prompt ist die Eingabeaufforderung.

Beispiel:

felix@server:~$

Bedeutung:

Teil Bedeutung
felix Benutzer
server Hostname
~ Home-Verzeichnis
$ normaler Benutzer

Bei Root sieht man häufig:

root@server:~#

Merksatz:

$ normaler Benutzer.
# häufig Root.

Standardkanäle

Linux-Programme verwenden drei wichtige Standardkanäle.

Kanal Nummer Bedeutung
stdin 0 Standardeingabe
stdout 1 Standardausgabe
stderr 2 Standardfehler

Beispiel:

Ein Befehl liest Eingaben über stdin,
schreibt normale Ergebnisse nach stdout
und Fehlermeldungen nach stderr.

Merksatz:

0 = Eingabe.
1 = Ausgabe.
2 = Fehler.

Standardausgabe

Die Standardausgabe ist die normale Ausgabe eines Befehls.

Beispiel:

ls

zeigt Dateien im Terminal an.

Diese Ausgabe kann man umleiten oder weiterverarbeiten.

Beispiel:

ls > dateiliste.txt

Merksatz:

stdout ist die normale Ausgabe.

Standardfehler

Die Standardfehlerausgabe enthält Fehlermeldungen.

Beispiel:

ls /nicht-vorhanden

Mögliche Fehlermeldung:

No such file or directory

Diese Fehlermeldung kommt über stderr.

Merksatz:

stderr ist für Fehlermeldungen.

Ausgabe umleiten mit >

Mit > wird die Standardausgabe in eine Datei geschrieben.

Beispiel:

ls > dateien.txt

Wichtig:

Wenn die Datei bereits existiert,
wird sie überschrieben.

Beispiel:

echo "Test" > datei.txt

schreibt Test in datei.txt und ersetzt vorhandenen Inhalt.

Merksatz:

> schreibt neu und überschreibt.

Ausgabe anhängen mit >>

Mit >> wird die Standardausgabe an eine Datei angehängt.

Beispiel:

echo "Neue Zeile" >> datei.txt

Der vorhandene Inhalt bleibt erhalten.

Typische Nutzung:

Logs erweitern

Ergebnisse sammeln

Text an Datei anhängen

Merksatz:

>> hängt an.

Eingabe umleiten mit <

Mit < wird eine Datei als Eingabe für einen Befehl verwendet.

Beispiel:

wc -l < datei.txt

Bedeutung:

wc zählt Zeilen,
liest die Eingabe aber aus datei.txt.

Merksatz:

< nutzt Datei als Eingabe.

Fehler umleiten mit 2>

Mit 2> leitet man Fehlermeldungen um.

Beispiel:

ls /nicht-vorhanden 2> fehler.txt

Bedeutung:

Fehlermeldungen werden in fehler.txt geschrieben.

Normale Ausgabe bleibt davon getrennt.

Merksatz:

2> leitet Fehlermeldungen um.

Fehler anhängen mit 2>>

Mit 2>> werden Fehlermeldungen an eine Datei angehängt.

Beispiel:

ls /nicht-vorhanden 2>> fehler.log

Merksatz:

2>> hängt Fehlermeldungen an.

Ausgabe und Fehler gemeinsam umleiten

Ausgabe und Fehler gemeinsam umleiten:

befehl > ausgabe.log 2>&1

Bedeutung:

stdout geht nach ausgabe.log.

stderr wird ebenfalls dorthin geleitet.

Kurzform bei Bash:

befehl &> ausgabe.log

Anhängen:

befehl &>> ausgabe.log

Merksatz:

&> leitet Ausgabe und Fehler gemeinsam um.

/dev/null

/dev/null ist ein spezielles Gerät, das Ausgaben verwirft.

Beispiel:

befehl > /dev/null

Fehler verwerfen:

befehl 2> /dev/null

Alles verwerfen:

befehl &> /dev/null

Typische Nutzung:

unerwünschte Ausgaben unterdrücken

Wichtig:

Nicht blind verwenden,
weil Fehlermeldungen dann verloren gehen.

Merksatz:

/dev/null ist der digitale Papierkorb.

Pipe

Eine Pipe leitet die Ausgabe eines Befehls an den nächsten Befehl weiter.

Zeichen:

|

Beispiel:

ls -l | grep ".log"

Bedeutung:

ls -l erzeugt Ausgabe.

grep filtert diese Ausgabe.

Merksatz:

Pipe verbindet Befehle.

Pipe-Beispiel mit Prozessen

Beispiel:

ps aux | grep ssh

Bedeutung:

ps aux zeigt Prozesse.

grep ssh filtert Zeilen mit ssh.

Typische Nutzung:

Prozesse suchen

Logs filtern

Paketlisten durchsuchen

Ausgaben zählen

Merksatz:

Pipe macht aus mehreren einfachen Befehlen eine Auswertung.

Pipe-Beispiel mit Logs

Beispiel:

journalctl -u ssh | grep -i "failed"

Bedeutung:

journalctl -u ssh zeigt SSH-Logs.

grep -i "failed" filtert fehlgeschlagene Einträge.

Merksatz:

Logs werden mit Pipes schnell auswertbar.

grep

grep sucht nach Textmustern.

Beispiele:

grep "error" logfile.txt

grep -i "error" logfile.txt

grep -n "error" logfile.txt

grep -r "PermitRootLogin" /etc/ssh

Wichtige Optionen:

Option Bedeutung
-i Groß-/Kleinschreibung ignorieren
-n Zeilennummer anzeigen
-r rekursiv suchen
-v Treffer umkehren
-l nur Dateinamen mit Treffern anzeigen

Merksatz:

grep filtert Text.

sort

sort sortiert Textzeilen.

Beispiel:

cat namen.txt | sort

Numerisch sortieren:

sort -n zahlen.txt

Rückwärts sortieren:

sort -r namen.txt

Merksatz:

sort sortiert Zeilen.

uniq

uniq entfernt direkt aufeinanderfolgende doppelte Zeilen.

Beispiel:

sort namen.txt | uniq

Wichtig:

uniq erkennt doppelte Zeilen nur,
wenn sie nebeneinander stehen.
Deshalb wird oft vorher sort verwendet.

Anzahl anzeigen:

sort namen.txt | uniq -c

Merksatz:

sort und uniq werden oft kombiniert.

wc

wc zählt Zeilen, Wörter und Zeichen.

Beispiele:

wc datei.txt

wc -l datei.txt

ps aux | wc -l

Bedeutung:

Option Bedeutung
-l Zeilen zählen
-w Wörter zählen
-c Bytes zählen

Merksatz:

wc -l zählt Zeilen.

cut

cut schneidet Spalten oder Zeichen aus Text.

Beispiel mit Trennzeichen:

cut -d ":" -f 1 /etc/passwd

Bedeutung:

-d ":" verwendet Doppelpunkt als Trenner.

-f 1 gibt das erste Feld aus.

Typische Nutzung:

einfache strukturierte Dateien auswerten

Spalten ausgeben

Merksatz:

cut extrahiert Felder aus Text.

awk kurz eingeordnet

awk ist ein Werkzeug zur Textverarbeitung.

Beispiel:

awk '{print $1}' datei.txt

Bedeutung:

gibt die erste Spalte aus.

awk ist mächtiger als cut, weil es Bedingungen, Berechnungen und komplexere Ausgaben kann.

Merksatz:

awk verarbeitet spaltenorientierten Text.

sed kurz eingeordnet

sed ist ein Stream-Editor.

Er kann Textströme verändern.

Beispiel:

sed 's/alt/neu/g' datei.txt

Bedeutung:

ersetzt alt durch neu in der Ausgabe.

Wichtig:

Ohne passende Option wird die Datei nicht automatisch geändert,
sondern nur die Ausgabe.

Merksatz:

sed verändert Textströme.

tee

tee schreibt Ausgabe gleichzeitig auf den Bildschirm und in eine Datei.

Beispiel:

echo "Test" | tee datei.txt

Anhängen:

echo "Neue Zeile" | tee -a datei.txt

Nützlich, wenn man Ausgabe sehen und speichern möchte.

Beispiel:

systemctl status ssh | tee ssh-status.txt

Merksatz:

tee zeigt und speichert gleichzeitig.

Befehle nacheinander ausführen mit ;

Mit ; führt man Befehle nacheinander aus, unabhängig davon, ob der vorherige erfolgreich war.

Beispiel:

echo "Start"; echo "Ende"

Auch wenn der erste Befehl fehlschlägt, wird der zweite ausgeführt.

Merksatz:

; führt einfach nacheinander aus.

Befehle nur bei Erfolg ausführen mit &&

Mit && wird der zweite Befehl nur ausgeführt, wenn der erste erfolgreich war.

Beispiel:

mkdir backup && cp datei.txt backup/

Bedeutung:

Nur wenn mkdir erfolgreich ist,
wird cp ausgeführt.

Merksatz:

&& bedeutet:
nur bei Erfolg weiter.

Befehle nur bei Fehler ausführen mit ||

Mit || wird der zweite Befehl nur ausgeführt, wenn der erste fehlschlägt.

Beispiel:

ping -c 1 server || echo "Server nicht erreichbar"

Merksatz:

|| bedeutet:
nur bei Fehler ausführen.

Exit-Code

Jeder Befehl liefert einen Exit-Code zurück.

Typisch:

Exit-Code Bedeutung
0 erfolgreich
ungleich 0 Fehler oder besonderer Zustand

Den letzten Exit-Code anzeigen:

echo $?

Beispiel:

ls /etc

echo $?

Merksatz:

Exit-Code 0 bedeutet Erfolg.

Warum Exit-Codes wichtig sind

Exit-Codes sind wichtig für:

- Skripte
- Automatisierung
- && und ||
- Monitoring
- Fehlerbehandlung
- Cronjobs
- systemd-Units

Beispiel:

grep "root" /etc/passwd

echo $?

Wenn grep etwas findet, ist der Exit-Code 0. Wenn nichts gefunden wird, ist der Exit-Code ungleich 0.

Merksatz:

Skripte entscheiden oft anhand von Exit-Codes.

Variablen

In der Shell können Variablen verwendet werden.

Beispiel:

NAME="Felix"

Ausgeben:

echo "$NAME"

Wichtig:

Keine Leerzeichen um das Gleichheitszeichen.

Richtig:

NAME="Felix"

Falsch:

NAME = "Felix"

Merksatz:

Variablen speichern Werte.

Umgebungsvariablen

Umgebungsvariablen beeinflussen Programme und Shell-Verhalten.

Beispiele:

Variable Bedeutung
HOME Home-Verzeichnis
USER Benutzername
PATH Suchpfade für Programme
SHELL aktuelle Shell
PWD aktuelles Verzeichnis

Anzeigen:

echo "$HOME"

echo "$PATH"

Alle Umgebungsvariablen anzeigen:

env

Merksatz:

Umgebungsvariablen beschreiben die Umgebung eines Prozesses.

PATH

PATH enthält Verzeichnisse, in denen die Shell nach Programmen sucht.

Anzeigen:

echo "$PATH"

Beispielinhalt:

/usr/local/bin:/usr/bin:/bin

Wenn man einen Befehl eingibt, sucht die Shell in diesen Verzeichnissen.

Prüfen, welches Programm ausgeführt wird:

which ssh

Merksatz:

PATH bestimmt,
wo Befehle gesucht werden.

Quotes

Anführungszeichen beeinflussen, wie die Shell Text verarbeitet.

Zeichen Bedeutung
" " Variablen werden ausgewertet
' ' Text bleibt fast vollständig unverändert
\ maskiert ein einzelnes Zeichen

Beispiele:

NAME="Felix"

echo "Hallo $NAME"

Ausgabe:

Hallo Felix

Beispiel:

echo 'Hallo $NAME'

Ausgabe:

Hallo $NAME

Merksatz:

Doppelte Quotes erlauben Variablen.
Einfache Quotes schützen Text stärker.

Wildcards

Wildcards sind Platzhalter.

Wildcard Bedeutung
* beliebige Zeichen
? genau ein Zeichen
[abc] eines der Zeichen a, b oder c

Beispiele:

ls *.log

rm *.tmp

cp backup-?.tar /tmp/

Merksatz:

* steht für beliebige Zeichen.

Achtung bei Wildcards und rm

Gefährlich:

rm *

Noch gefährlicher:

rm -rf *

Sicherer prüfen:

echo *

ls

pwd

Dann erst löschen.

Merksatz:

Vor rm mit Wildcards immer prüfen,
was betroffen ist.

Befehlshistorie

Die Shell speichert häufig eine Befehlshistorie.

Anzeigen:

history

Letzten Befehl erneut ausführen:

!!

Nach Befehlen suchen:

Strg + R

Wichtig:

Keine Passwörter oder Geheimnisse direkt in Befehle schreiben,
weil sie in der Historie landen können.

Merksatz:

history ist praktisch,
kann aber Geheimnisse verraten.

Tab-Vervollständigung

Mit Tab kann die Shell Befehle, Dateinamen und Pfade vervollständigen.

Vorteile:

weniger Tippfehler

schnelleres Arbeiten

Pfade prüfen

Befehle entdecken

Merksatz:

Tab spart Zeit und reduziert Tippfehler.

Aliases

Aliases sind Abkürzungen für Befehle.

Beispiel:

alias ll='ls -la'

Danach kann man eingeben:

ll

und es wird ausgeführt:

ls -la

Wichtig:

Aliases gelten je nach Konfiguration nur in der aktuellen Shell
oder dauerhaft über Dateien wie ~/.bashrc.

Merksatz:

Aliases sind Befehlsabkürzungen.

.bashrc und .profile

Benutzerspezifische Shell-Konfigurationen liegen häufig in:

~/.bashrc

~/.profile

Dort können stehen:

Aliases

Umgebungsvariablen

Prompt-Konfiguration

Shell-Funktionen

PATH-Erweiterungen

Wichtig:

Fehler in diesen Dateien können Shell-Verhalten beeinflussen.

Merksatz:

~/.bashrc beeinflusst die interaktive Bash.

Typische Befehlsketten

Prozesse nach nginx suchen:

ps aux | grep nginx

Fehler in Logs zählen:

grep -i "error" /var/log/syslog | wc -l

Größte Ordner anzeigen:

du -sh * | sort -h

Benutzer aus /etc/passwd anzeigen:

cut -d ":" -f 1 /etc/passwd

Doppelte Zeilen zählen:

sort datei.txt | uniq -c

Merksatz:

Pipes machen Auswertungen aus einfachen Befehlen.

Typische Fehlerbilder

Fehlerbild Wahrscheinliche Ursache
Datei leer nach Befehl > hat Datei überschrieben
Fehler nicht in Datei stderr wurde nicht umgeleitet
Befehl nicht gefunden PATH oder Paket fehlt
Variable leer falsch gesetzt oder falsch zitiert
rm löscht zu viel Wildcard falsch verwendet
grep findet nichts Groß-/Kleinschreibung oder Muster falsch
Pipe liefert nichts erster Befehl erzeugt keine passende Ausgabe
Permission denied fehlende Rechte
Ausgabe fehlt nach /dev/null umgeleitet
Skript reagiert falsch Exit-Code nicht beachtet

Befehl nicht gefunden

Fehlermeldung:

command not found

Mögliche Ursachen:

Paket nicht installiert

Tippfehler

Befehl liegt nicht im PATH

Skript nicht ausführbar

falsche Shell

Prüfen:

which befehl

echo "$PATH"

ls -l datei

Merksatz:

command not found bedeutet:
Shell findet den Befehl nicht.

Permission denied bei Skript

Fehlerbild:

./script.sh: Permission denied

Mögliche Ursachen:

Skript hat kein Ausführrecht

Dateisystem ist mit noexec gemountet

falsche Rechte

Prüfen:

ls -l script.sh

Ausführbar machen:

chmod +x script.sh

Starten:

./script.sh

Merksatz:

Skript direkt starten braucht x-Recht.

Sichere Arbeitsweise in der Shell

Vor riskanten Befehlen:

pwd

ls -la

echo *.tmp

Befehl ohne Löschung testen,
wenn möglich

Bei Umleitungen:

> überschreibt

>> hängt an

Bei Root-Rechten:

Befehl genau prüfen

Pfad genau prüfen

Wildcards vermeiden oder vorher testen

Merksatz:

In der Shell erst prüfen,
dann ausführen.

Typische Prüfungsfragen

Frage Kurzantwort
Was ist eine Shell? Befehlsinterpreter
Was ist Bash? verbreitete Linux-Shell
Was macht eine Pipe? Ausgabe an nächsten Befehl weitergeben
Was macht >? Ausgabe in Datei schreiben und überschreiben
Was macht >>? Ausgabe an Datei anhängen
Was macht 2>? Fehlerausgabe umleiten
Was ist stdout? Standardausgabe
Was ist stderr? Standardfehler
Was ist stdin? Standardeingabe
Was bedeutet Exit-Code 0? Erfolg
Was macht grep? Text filtern
Was macht wc -l? Zeilen zählen
Was macht sort? Zeilen sortieren
Was macht uniq? doppelte Nachbarzeilen entfernen
Was macht tee? Ausgabe anzeigen und speichern

Typische Prüfungsfallen

Falle Richtig denken
> und >> verwechseln > überschreibt, >> hängt an
stderr nicht umleiten Fehler gehen über Kanal 2
Pipe mit Umleitung gleichsetzen Pipe zu Befehl, Umleitung zu Datei
grep ohne -i bei unbekannter Schreibweise -i ignoriert Groß-/Kleinschreibung
uniq ohne sort nutzen doppelte Zeilen müssen nebeneinander stehen
rm mit * unterschätzen vorher mit echo oder ls prüfen
Variablen mit Leerzeichen setzen NAME="Wert", nicht NAME = "Wert"
einfache und doppelte Quotes verwechseln einfache Quotes werten Variablen nicht aus
command not found falsch deuten Paket, PATH oder Tippfehler prüfen
Exit-Codes ignorieren wichtig für Skripte und Automatisierung

IHK-sichere Kurzformulierung

Die Shell ist ein Befehlsinterpreter, der Befehle ausführt und deren Ein- und Ausgaben steuern kann. Linux unterscheidet Standardeingabe, Standardausgabe und Standardfehler mit den Kanälen 0, 1 und 2. Mit Pipes wird die Ausgabe eines Befehls an einen weiteren Befehl weitergegeben. Mit > wird Ausgabe in eine Datei geschrieben und überschrieben, mit >> wird sie angehängt. Fehlerausgaben können mit 2> umgeleitet werden. Werkzeuge wie grep, sort, uniq, wc, cut, awk, sed und tee werden häufig kombiniert, um Text, Logs und Befehlsausgaben auszuwerten. Exit-Codes zeigen an, ob ein Befehl erfolgreich war, und sind besonders wichtig für Skripte und Automatisierung.


Merksätze

Shell = Befehlsinterpreter.

Bash ist eine verbreitete Shell.

stdin = Eingabe.

stdout = Ausgabe.

stderr = Fehlerausgabe.

0 = stdin.

1 = stdout.

2 = stderr.

> überschreibt.

>> hängt an.

2> leitet Fehler um.

&> leitet Ausgabe und Fehler um.

/dev/null verwirft Ausgaben.

Pipe verbindet Befehle.

grep filtert Text.

sort sortiert Zeilen.

uniq entfernt doppelte Nachbarzeilen.

wc -l zählt Zeilen.

cut extrahiert Felder.

awk verarbeitet Spalten.

sed verändert Textströme.

tee zeigt und speichert gleichzeitig.

; führt nacheinander aus.

&& läuft nur bei Erfolg weiter.

|| läuft nur bei Fehler weiter.

Exit-Code 0 bedeutet Erfolg.

PATH bestimmt,
wo Befehle gesucht werden.

Doppelte Quotes werten Variablen aus.

Einfache Quotes schützen Text stärker.

* steht für beliebige Zeichen.

Vor rm mit Wildcards immer prüfen.

Erst testen,
dann ausführen.