Weitere Grundlagen der Shell
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.
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 |
|
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 |
|
(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 |
|
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
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.