sammlung:cli_prompt_io_error
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
- Zugriff auf die Linux-Kommandozeile
- Grundkenntnisse in Bash-Kommandos
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
- Fehler nicht verbergen:
2> /dev/nullnur wenn wirklich nötig - Logs mit Zeitstempel: Immer Datum/Zeit bei wichtigen Logs
- Exit-Codes prüfen: In Skripten immer Erfolg/Fehler behandeln
- tee für wichtige Ausgaben: Gleichzeitig anzeigen und speichern
- Pipes statt temporäre Dateien: Effizienter und sauberer
- Fehler in separate Datei:
command > output.log 2> error.log
Siehe auch
sammlung/cli_prompt_io_error.txt · Zuletzt geändert: von 127.0.0.1
