Inhaltsverzeichnis

CLI Prompt: Eingabe, Ausgabe und Fehlerbehandlung

Die Kommandozeile (CLI - Command Line Interface) arbeitet mit drei Standard-Datenströmen: Eingabe (stdin), Ausgabe (stdout) und Fehlerausgabe (stderr). Das Verständnis dieser Konzepte ist fundamental für effektive Arbeit mit der Shell.

Voraussetzungen

Der Prompt

Der Prompt zeigt an, dass die Shell bereit für Eingaben ist.

Typische Prompts

# Standard-User
user@hostname:~$

# Root-User
root@hostname:~#

# Mit Pfad
user@hostname:/var/log$
 
# Nur Pfad
~/documents$

Prompt-Bestandteile

Symbol Bedeutung
$ Normaler Benutzer
# Root-Benutzer (Administrator)
~ Home-Verzeichnis
/ Root-Verzeichnis
@ Trennt Benutzer und Hostname

Die drei Standard-Datenströme

Name Beschreibung Dateideskriptor Symbol
stdin Standard-Eingabe (Tastatur) 0 <
stdout Standard-Ausgabe (Bildschirm) 1 >
stderr Fehler-Ausgabe (Bildschirm) 2 2>

Visualisierung

Tastatur → stdin (0) → Programm → stdout (1) → Bildschirm
                                 ↘ stderr (2) → Bildschirm

Ausgabe-Umleitung (Output Redirection)

Stdout umleiten

# Ausgabe in Datei schreiben (überschreibt)
ls -l > dateiliste.txt
 
# An Datei anhängen
echo "Neue Zeile" >> logfile.txt
 
# Ausgabe verwerfen
command > /dev/null
 
# Beispiele
date > datum.txt
cat file1.txt file2.txt > zusammen.txt
echo "Hallo Welt" > greeting.txt

Stderr umleiten

# Nur Fehler in Datei
command 2> fehler.log
 
# Fehler verwerfen
command 2> /dev/null
 
# Beispiel: Nur Fehler anzeigen
find / -name "*.conf" 2> /dev/null
 
# Fehler an Datei anhängen
command 2>> fehler.log

Stdout und Stderr kombinieren

# Beide in dieselbe Datei (moderne Syntax)
command &> alles.log
command > alles.log 2>&1  # Alternative
 
# Beide anhängen
command &>> alles.log
 
# Stdout in Datei, Stderr auf Bildschirm
command > ausgabe.txt
 
# Stdout auf Bildschirm, Stderr in Datei
command 2> fehler.txt
 
# Beide getrennt
command > ausgabe.txt 2> fehler.txt
 
# Stdout in Datei, Stderr verwerfen
command > ausgabe.txt 2> /dev/null

Eingabe-Umleitung (Input Redirection)

Stdin umleiten

# Eingabe aus Datei lesen
command < eingabe.txt
 
# Beispiele
wc -l < datei.txt
mail user@example.com < email.txt
mysql -u root -p database < dump.sql

Here-Document (<<)

# Mehrzeilige Eingabe
cat << EOF > datei.txt
Zeile 1
Zeile 2
Zeile 3
EOF
 
# Mit Variablen
cat << EOF
Benutzer: $USER
Pfad: $PWD
EOF
 
# In Skript verwenden
mysql -u root -p << SQL
USE database;
SELECT * FROM users;
SQL

Here-String (<<<)

# Einzeilige String-Eingabe
command <<< "Text"
 
# Beispiele
wc -w <<< "Hallo Welt"
grep "error" <<< "$LOG_OUTPUT"

Pipes (|)

Pipes leiten die Ausgabe eines Befehls als Eingabe an den nächsten weiter.

Grundlegendes Piping

# Einfache Pipe
command1 | command2
 
# Beispiele
ls -l | grep "txt"
cat datei.txt | wc -l
ps aux | grep "apache"

Mehrfache Pipes

# Pipe-Ketten
command1 | command2 | command3
 
# Beispiele
cat access.log | grep "404" | wc -l
ps aux | grep "apache" | awk '{print $2}'
ls -la | grep "^d" | sort -k5 -rn | head -10
 
# Sortieren, Duplikate entfernen, zählen
cat liste.txt | sort | uniq | wc -l

Pipe mit Umleitung kombinieren

# Pipe und Ausgabe in Datei
command1 | command2 > ergebnis.txt
 
# Pipe und Fehler in Datei
command1 2>&1 | grep "error" > fehler.txt
 
# Mehrfach speichern mit tee
command | tee ausgabe.txt | grep "wichtig"

tee - Ausgabe duplizieren

# Ausgabe auf Bildschirm UND in Datei
command | tee datei.txt
 
# An Datei anhängen
command | tee -a datei.txt
 
# In mehrere Dateien
command | tee datei1.txt datei2.txt
 
# Beispiele
echo "Test" | tee log.txt
ls -la | tee verzeichnis.txt
make 2>&1 | tee build.log

Praktische Beispiele

Log-Analyse

# Fehler in Logdatei finden
grep "ERROR" /var/log/syslog > fehler.txt
 
# Fehler zählen
grep "ERROR" /var/log/syslog | wc -l
 
# Nach Datum filtern
grep "2024-01-15" /var/log/syslog | grep "ERROR" > heute-fehler.txt
 
# Nur eindeutige Fehler
grep "ERROR" /var/log/syslog | sort | uniq > eindeutige-fehler.txt

Prozess-Verwaltung

# Prozesse filtern und PIDs extrahieren
ps aux | grep "apache" | awk '{print $2}'
 
# Prozess-IDs in Datei
ps aux | grep "apache" | awk '{print $2}' > apache-pids.txt
 
# Speichernutzung der Top-10 Prozesse
ps aux --sort=-%mem | head -11 | tee top-memory.txt

Dateiverwaltung

# Große Dateien finden
find /home -type f -size +100M 2> /dev/null | tee grosse-dateien.txt
 
# Dateien zählen nach Typ
find . -type f | sed 's/.*\.//' | sort | uniq -c | sort -rn
 
# Backup mit Log
tar -czf backup.tar.gz /data 2>&1 | tee backup.log

System-Informationen sammeln

# System-Report erstellen
{
    echo "=== Hostname ==="
    hostname
    echo "=== Datum ==="
    date
    echo "=== Uptime ==="
    uptime
    echo "=== Disk Usage ==="
    df -h
    echo "=== Memory ==="
    free -h
} > system-report.txt

Fehlerbehandlung in Skripten

Exit-Codes

# Exit-Code des letzten Befehls
echo $?
 
# 0 = Erfolg, alles andere = Fehler
command
if [ $? -eq 0 ]; then
    echo "Erfolgreich"
else
    echo "Fehler aufgetreten"
fi
 
# Kurzform mit && und ||
command && echo "Erfolg" || echo "Fehler"

Fehlerbehandlung

# Bei Fehler abbrechen
set -e
command1
command2  # Stoppt hier wenn command1 fehlschlägt
 
# Fehler protokollieren
command 2>&1 | tee -a error.log
 
# Nur bei Erfolg weiter
command1 && command2 && command3
 
# Bei Fehler Alternative
command1 || command2

Nützliche Kombinationen

Statistiken erstellen

# Top 10 häufigste Befehle
history | awk '{print $2}' | sort | uniq -c | sort -rn | head -10
 
# Zugriffe pro IP
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn
 
# Dateigrößen summieren
find . -type f | xargs du -ch | tail -1

Live-Monitoring

# Log live verfolgen und filtern
tail -f /var/log/syslog | grep --line-buffered "ERROR"
 
# Mit Zeitstempel
tail -f /var/log/app.log | while read line; do
    echo "$(date '+%H:%M:%S') $line"
done

Batch-Verarbeitung

# Alle Dateien verarbeiten
find . -name "*.txt" | while read file; do
    wc -l "$file"
done > zeilen-anzahl.txt
 
# Mit Fehlerprotokoll
find . -name "*.jpg" -exec convert {} -resize 50% {}.small \; 2> convert-errors.log

Spezielle Umleitungen

File Descriptors

# Eigene File Descriptors
exec 3> custom.log
echo "Nachricht" >&3
exec 3>&-  # Schließen
 
# Beide Streams tauschen
command 3>&1 1>&2 2>&3

Process Substitution

# Ausgabe als Datei behandeln
diff <(command1) <(command2)
 
# Beispiele
diff <(ls dir1) <(ls dir2)
comm -12 <(sort file1.txt) <(sort file2.txt)

Best Practices

Siehe auch