====== 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 [[sammlung:bash_kommandos|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/null'' nur 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:bash_kommandos|Bash Kommandos]] * [[sammlung:grep|grep - Text durchsuchen]] * [[sammlung:bash_profile_bashrc|Shell-Konfiguration]] * [[sammlung:cat_less_more_head_tail|Dateien anzeigen]] {{tag>linux bash shell io redirection pipe stdin stdout stderr}}