Programmierpraktikum SoSe 2024, Bachelor Informatik, FU Berlin
ProPra2024 > Werkzeuge > Unix-Basiswerkzeuge > Shell-Grundlagen2

Weitere Grundlagen der Shell

Idea
Trial

Ziel

Ich habe weitere Grundmechanismen von Unix-Shells verstanden und selber ausprobiert.

Hintergrund

Unix basiert an vielen Stellen auf sehr einfachen Grundideen, z.B. "fast alles ist eine Datei". In der Shell laufen diese Ideen zu großer Form auf: man kann mit einfachen Mitteln immer wieder eine hilfreiche Automatisierung mit sehr wenig Aufwand hinbekommen.

Loose

Arbeitsschritte

Wir benutzen weiter die Bash-Referenzdokumentation auf https://www.gnu.org/software/bash/manual/html_node/index.html. Lassen Sie am besten dieses Inhaltsverzeichnis immer geöffnet und öffnen Sie gewünschte Abschnitt immer in einem separaten Tab.

Flexibel 1: Umlenkung und Pipelines

In Unix werden ohne weiteres Zutun jedem gestarteten Programm drei Dateien geöffnet, die die Filedeskriptoren 0, 1, und 2 bekommen, siehe auch man stdin:

  • 0: standard input, stdin (deutsch: Standardeingabe)
  • 1: standard output, stdout (deutsch: Standardausgabe)
  • 2: standard error, stderr (deutsch: Standardfehler)

Bei dem Kommando

1
grep -r -P --include '*.py' "^import re" . | wc -l

aus Shell-Grundlagen bedeutet das pipe-Symbol |, dass stdout von grep nicht wie üblich mit dem Terminal verbunden wird, sondern mit stdin von wc. Man kann das gleiche Spiel mit stdout von wc wiederholen und ein drittes Kommando anflanschen usw. Ein solches Konstrukt nennt man eine Pipeline, man spricht also metaphorisch von einer (Daten)Röhre von einem Prozess zum nächsten.

Eine solche "Umlenkung" der Standardausgabe kann man auch in Dateien richten anstatt in Prozesse.

Probieren Sie der Reihe nach folgendes aus und vollziehen Sie nach, was da passiert (BR 3.6):

1
2
3
4
cat student.yaml
grep partner_ student.yaml diesedateigibtesnicht
grep partner_ student.yaml diesedateigibtesnicht > /tmp/out
cat /tmp/out

(Das Verzeichnis /tmp dient auf Unix-Systemen für Dateien, die nicht dauerhaft aufbewahrt werden sollen.)

1 Warum ist die Fehlermeldung trotz der Umlenkung auf dem Terminal erschienen? Zitieren Sie 1-2 Sätze (mit Quellenangabe) aus einer auf dieser Seite bereits erwähnten Referenzdokumentation als Beleg für Ihre Behauptung.

2 Wie lautet zweite grep-Kommando, wenn man es so erweitert, dass auch die Fehlermeldung umgelenkt wird und dann in /tmp/err landet?

3 Angenommen, Sie machen anschließend noch grep _name student.yaml > /tmp/out, wieviele Zeilen stehen dann in /tmp/out (BR 3.6)? Warum? Mit welcher kleinen Änderung des Kommandos kann man den gesamten Output erhalten?

Flexibel 2: &&, ;, cd, Subshells

Ein Idiom, das man im Netz häufig sieht, ist folgendes Kommando auf Debian-Systemen:
sudo apt update && sudo apt upgrade.
Es dient zur Aktualisierung aller installierten Pakete, für die es eine neuere Version gibt.

4 Was bedeutet das && in dem Kommando? (BR 3.2.4)

5 Warum benutzt man stattdessen nicht einfach ;?

Angenommen, Sie führen folgendes Kommando im Homeverzeichnis aus:
(cd subdir; grep somestuff *.md)

6 Was bedeuten die Klammern (BR 3.2.5)?

7 In welchem Verzeichnis befinden Sie sich anschließend (BR 4.1)? Unter welchen Umständen sparen Sie im obigen Fall ein ganzes Kommando ein?

Flexibel 3: Asynchrone Ausführung

Man kann jedes Shell-Kommando mit Ctrl-Z jederzeit unterbrechen und auf Eis legen. Es wird dadurch zu einem gestoppten Hintergrundjob.

Probieren Sie (sleep 5; echo Fertig) und dann Ctrl-Z: Auch nach Ende der 5 Sekunden kommt keine Ausgabe "Fertig". Mit fg (wie "foreground") lässt sich ein solcher angehaltener Hintergrundjob fortsetzen. Probieren Sie auch dies.

Man kann einen Job auch von vornherein zu einem Hintergrundjob machen, indem man ein & an das Kommando anhängt. Das ist beispielsweise für Webserver nützlich, die man während der Entwicklung braucht und die dann Protokollausgaben direkt in die laufende Shell schreiben können. Probieren sie diese drei

1
2
3
4
(sleep 5; echo "5 Sekunden")&
(sleep 15; echo "15 Sekunden")&
(sleep 30; echo "30 Sekunden")&
ls

und warten Sie dann ab, bis alle drei Kommandos fertig sind. Starten Sie dann ein (sleep 300; echo "300 Sekunden")& (sleep 400; echo "400 Sekunden")&

8 Wie können Sie jetzt eine Liste der aktuellen Hintergrundjobs anzeigen? (BR 7.2)

9 Wie stoppen Sie nun den ersten dieser beiden Hintergrundjobs (nur stoppen, nicht abbrechen)?

Hinweis (nur bei Bedarf): Was ist eine jobspec?

z.B. %1

Information
Reflection

Abgabe

Geben Sie ein Markdown-Dokument ab mit knappen Antworten zu den oben gestellten Fragen 1, 2, … Geben Sie diese Marker mit an.
Geben Sie ggf. Beispiele oder benutzte Quellen an.