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
- Wechseln Sie in Ihren
shell-labOrdner aus Lab 1.
Aufgabe 1 – stdin, stdout, stderr verstehen
1.1 stdout: „normale“ Ausgabe
- Geben Sie den Text „Hallo stdout“ mit
echoaus. - 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.txtum. - Leiten Sie stderr in eine Datei
err.txtum. - Prüfen Sie beide Dateien nach jeder Ausführung der Befehle.
- Leiten Sie stdout in eine Datei
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 um2>leitet stderr um2steht 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.txtnach einem Wort indem Sie die Datei mitcatausgeben und die Ausgabe per Pipe angrepweiterleiten.
Lösung
cat notizen.txt | grep -i apfel
3.2 Mehrfaches grep
- Suchen Sie in
notizen.txtzuerst nach einem Wort und filtern Sie die Ergebnisse danach mit einem zweitengrep.
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
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
lsauf eine existierende und eine nicht existierende Datei. - Leiten Sie beides in eine Datei
alles.txtum. - 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.txtund stderr innur_err.txtum. - 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
HOMEaus. - Geben Sie den Wert der Variable
PATHaus.
Lösung
echo $HOME
echo $PATH
5.2 Eigene Variable setzen (nur für diese Shell)
- Setzen Sie eine Variable
MY_NAMEauf 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_CITYohneexport - Starten Sie eine neue Bash mit
bashund 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
~/.bashrcgibt. - Öffnen Sie sie mit
nano.
Lösung
ls -a ~ | grep bashrc
nano ~/.bashrc
7.3 Eigene Aliases eintragen
- Fügen Sie am Ende der
~/.bashrcfolgende Aliases hinzu: mkdirpfürmkdir -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
.bashrcindem 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
gfürgitein. - Testen Sie die Autocompletion für
git(z. B.git ch+ Tab fürgit checkout). - Testen Sie die Autocompletion für
g(z. B.g ch+ Tab fürgit checkout). - Fügen Sie in der
.bashrcdie nötige Zeile hinzu, damit Autocompletion fürgfunktioniert:complete -F _git g - Laden Sie die
.bashrcneu 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
exportmacht - Sie arbeiten schneller mit History und Tab-Completion
- Sie können Ihre Shell über
~/.bashrcpersonalisieren