Zum Inhalt

Shell

Ziel

Dieses Hands-On baut auf dem ersten Lab auf. Sie vertiefen nun typische Shell-Werkzeuge, die im Alltag ständig gebraucht werden. Nach Abschluss dieses Labs können Sie:

  • Ein- und Ausgaben von Programmen verstehen (stdin, stdout, stderr)
  • Befehle mit Pipes und Umleitungen kombinieren
  • Exit Codes nutzen, um Erfolg/Fehler zu erkennen
  • mit Environment-Variablen arbeiten
  • die History effizient verwenden
  • Tab-Completion verstehen und in der bashrc sinnvoll konfigurieren

Hilfsmittel

  • Arbeiten Sie wie im ersten Lab Schritt für Schritt.
  • Wenn etwas “nichts ausgibt”, ist das oft normal – achten Sie dann auf Exit Codes.
  • Bei jeder Aufgabe gibt es einen ausklappbaren Lösungsweg.
  • Nutzen Sie das Cheatsheet für schnelle Referenzen: Shell Cheatsheet

Vorbereitung – Ordner anlegen und Beispieldaten erzeugen

  1. Wechseln Sie in Ihren shell-lab Ordner aus Lab 1.

Aufgabe 1 – stdin, stdout, stderr verstehen

1.1 stdout: „normale“ Ausgabe

  • Geben Sie den Text „Hallo stdout“ mit echo aus.
  • Beobachten Sie, dass die Ausgabe im Terminal erscheint (stdout).
Lösung
echo "Hallo stdout"

1.2 stderr: Fehlermeldungen

  • Erzeugen Sie absichtlich eine Fehlermeldung, z. B. durch Zugriff auf eine nicht vorhandene Datei.
  • Beobachten Sie die Fehlermeldung.
Lösung
ls gibt_es_nicht.txt

1.3 stdout vs stderr getrennt umleiten

  • Nutzen Sie die Befehle aus 1.1 und 1.2 erneut und leiten Sie jeweils die Ausgaben in separate Dateien um:
    • Leiten Sie stdout in eine Datei out.txt um.
    • Leiten Sie stderr in eine Datei err.txt um.
    • Prüfen Sie beide Dateien nach jeder Ausführung der Befehle.
Lösung
echo "Hallo stdout" > out.txt
cat out.txt
echo "Hallo stdout" 2> err.txt
cat err.txt

ls gibt_es_nicht.txt 2> out.txt
cat out.txt
ls gibt_es_nicht.txt 2> err.txt
cat err.txt

cat out.txt
cat err.txt

Merksatz

  • > leitet stdout um
  • 2> leitet stderr um
  • 2 steht für „Dateideskriptor 2“ (stderr)

Aufgabe 2 – Exit Codes nutzen

Ein Exit Code ist eine Zahl, die ein Programm beim Beenden zurückgibt: - 0 bedeutet meistens: Erfolg - ≠ 0 bedeutet meistens: Fehler

2.1 Exit Code anzeigen

  • Führen Sie einen erfolgreichen Befehl aus und zeigen Sie danach den Exit Code an.
  • Wiederholen Sie das mit einem fehlschlagenden Befehl.
Lösung
ls notizen.txt
echo $?

ls gibt_es_nicht.txt
echo $?

Aufgabe 3 – Pipes: Befehle kombinieren

Eine Pipe | nimmt stdout des linken Befehls und gibt ihn als stdin an den rechten weiter.

3.1 cat | grep

  • Suchen Sie in notizen.txt nach einem Wort indem Sie die Datei mit cat ausgeben und die Ausgabe per Pipe an grep weiterleiten.
Lösung
cat notizen.txt | grep -i apfel

3.2 Mehrfaches grep

  • Suchen Sie in notizen.txt zuerst nach einem Wort und filtern Sie die Ergebnisse danach mit einem zweiten grep.
Lösung
cat notizen.txt | grep -i apfel | grep -i banane

3.2 grep | head

  • Suchen Sie nach einem Wort das häufig vorkommt und zeigen Sie nur die ersten Trefferzeilen.
Lösung
cat daten.txt | grep -i the | head

stdin kann auch aus Dateien kommen

Viele Befehle können Dateien direkt lesen:

grep -i apfel daten.txt
Pipes sind besonders praktisch, wenn mehrere Befehle kombiniert werden sollen.

Aufgabe 4 – Umleitungen: >, >>, 2>, &>

4.1 Ausgabe überschreiben vs anhängen

  • Schreiben Sie eine Zeile in log.txt.
  • Hängen Sie danach eine zweite Zeile an.
  • Prüfen Sie den Inhalt.
Lösung
echo "Start" > log.txt
echo "Weiter" >> log.txt
cat log.txt

4.2 stdout und stderr gemeinsam umleiten

  • Lassen Sie in einem Befehl bewusst sowohl stdout als auch stderr entstehen. Das geht zum Beispiel mit ls auf eine existierende und eine nicht existierende Datei.
  • Leiten Sie beides in eine Datei alles.txt um.
  • Prüfen Sie die Datei.
Lösung
ls notizen.txt gibt_es_nicht.txt &> alles.txt
cat alles.txt

4.3 stdout und stderr getrennt umleiten

  • Lassen Sie in einem Befehl bewusst sowohl stdout als auch stderr entstehen.
  • Leiten Sie stdout in nur_out.txt und stderr in nur_err.txt um.
  • Prüfen Sie beide Dateien.
Lösung
ls notizen.txt gibt_es_nicht.txt > nur_out.txt 2> nur_err.txt
cat nur_out.txt
cat nur_err.txt

Aufgabe 5 – Environment-Variablen

Environment-Variablen (Env-Variablen) sind Schlüssel/Wert-Paare, die Programme lesen können.

5.1 Eine Variable anzeigen

  • Geben Sie den Wert der Variable HOME aus.
  • Geben Sie den Wert der Variable PATH aus.
Lösung
echo $HOME
echo $PATH

5.2 Eigene Variable setzen (nur für diese Shell)

  • Setzen Sie eine Variable MY_NAME auf Ihren Namen.
  • Geben Sie die Variable in einem Satz aus. Zum Beispiel: "Mein Name ist Janosch."
Lösung
MY_NAME="Janosch"
echo "Mein Name ist $MY_NAME."

5.3 Exportieren: Variable an Unterprozesse weitergeben

  • Setzen Sie TRAINING_CITY ohne export
  • Starten Sie eine neue Bash mit bash und versuchen Sie, die Variable dort auszulesen.
  • Beenden Sie die neue Bash mit exit.
  • Wiederholen Sie das mit export.
Lösung

Ohne export (nicht vererbt):

TRAINING_CITY="Berlin"
bash
echo $TRAINING_CITY
exit

Mit export (wird vererbt):

export TRAINING_CITY="Berlin"
bash
echo $TRAINING_CITY
exit

5.4 Env-Variablen anzeigen

  • Lassen Sie sich alle Env-Variablen anzeigen und suchen Sie z. B. nach HOME.
Lösung
env | grep HOME

Aufgabe 6 – History effizient nutzen

6.1 Letzte Befehle anzeigen

  • Lassen Sie sich die letzten Befehle anzeigen.
Lösung
history

6.2 Suche in der History

  • Nutzen Sie Strg + R (reverse-i-search) und suchen Sie nach einem früheren Befehl (z. B. grep).
  • Bestätigen Sie den gefundenen Befehl mit Enter.
Lösung
  • Drücken Sie Strg + R
  • tippen Sie z. B. grep
  • drücken Sie Enter, um auszuführen

Aufgabe 7 – Tab-Completion, bashrc und sinnvolle Konfiguration

7.1 Was ist die bashrc?

Die Datei ~/.bashrc wird beim Start einer interaktiven Bash-Shell geladen (meist in Terminals).

  • Prüfen Sie, ob es ~/.bashrc gibt.
  • Öffnen Sie sie mit nano.
Lösung
ls -a ~ | grep bashrc
nano ~/.bashrc

7.3 Eigene Aliases eintragen

  • Fügen Sie am Ende der ~/.bashrc folgende Aliases hinzu:
  • mkdirp für mkdir -p
Lösung

Öffnen:

nano ~/.bashrc

Am Ende hinzufügen:

alias mkdirp='mkdir -p'

Speichern: Strg + O, Enter – Beenden: Strg + X

7.4 Änderungen aktivieren

  • Laden Sie die .bashrc indem Sie eine neue Shell starten.
  • Testen Sie die neuen Aliases.
Lösung
mkdirp new_folder/subfolder

7.5 Autocompletion für Aliases aktivieren

  • Richten Sie einen weiteren Alias g für git ein.
  • Testen Sie die Autocompletion für git (z. B. git ch + Tab für git checkout).
  • Testen Sie die Autocompletion für g (z. B. g ch + Tab für git checkout).
  • Fügen Sie in der .bashrc die nötige Zeile hinzu, damit Autocompletion für g funktioniert:
    complete -F _git g
    
  • Laden Sie die .bashrc neu und testen Sie erneut.

Abschluss

🎉 Sie können jetzt deutlich mehr als „nur Befehle tippen“:

  • Sie verstehen den Datenfluss über stdin/stdout/stderr
  • Sie kombinieren Befehle mit Pipes
  • Sie erkennen Erfolg/Fehler über Exit Codes
  • Sie nutzen Env-Variablen und wissen, was export macht
  • Sie arbeiten schneller mit History und Tab-Completion
  • Sie können Ihre Shell über ~/.bashrc personalisieren