Woche 2
Themen der Woche 2
- Pipes und Filters
- Konsolenanwendungen
- Komfortabel in der Kommandozeile
In den Videos wird die folgende Beispieldatei genutzt:
Standard Streams
- stdin Stream für die Eingabedaten (z.B. Eingagen über die Tastatur)
- stdout Stream für die Ausgabedaten
- stderr Stream für die Fehlermeldungen
Filter
Filter sind Programme, die Daten von stdin lesen und nach stdout ausgeben.
Pipes (Pipelines)
Pipes verbinden 2 oder mehr Filter. Dabei wird die stdout Ausgabe des Vorgängers an stdin Eingabe des Nachfolgers weitergeleitet.
Hintergrundprozesse
Zum Thema jobs (Vodergrund-/Hintergrundprozesse) gibt es einen kurzen Übersichtsartikel: Jobs im Griff mit jobs, bg, fg und &.
Ergänzend kann man in der Shell noch folgendes nutzen: nach dem Starten eines Kommandos/Prozesses im Hintergrund kann man sich seine Prozess ID (pid) über die Variable $! holen.
Die PID des laufenden Shell Prozesses bekommt man über die Variable $$. Wenn man auf das Ende eine Hintergrundprozesses warten will, geht das über das Kommando wait
Wie erkenne ich, das ein Prozess ein Hintergrundprozesse meiner Shell ist?
Die PPID (Parent PID) des Hintergrundprozesses verweist auf die PID meines Shell
Prozesses.
Jetzt alles zusammen:
sleep 3 &
bgpid=$!
echo "pid : $$"
echo "bgpid : $bgpid"
echo ""
ps -opid,ppid,cmd
echo "----------"
#
echo ""
wait $bgpid
ps -opid,ppid,cmd
echo "----------"
Die Ausgabe sieht dann im Wesentlichen so aus (die Prozesse oberhalb von -bash habe ich aus der Liste gelöscht):
pid : 1724923
bgpid : 1724924
PID PPID CMD
1724826 1724825 -bash
1724923 1724826 /bin/bash ./xx
1724924 1724923 sleep 3
1724925 1724923 ps -opid,ppid,cmd
----------
PID PPID CMD
1724826 1724825 -bash
1724923 1724826 /bin/bash ./xx
1724926 1724923 ps -opid,ppid,cmd
----------
Der sleep Hintergrundprozess hat die PID 1724924 und die PPID 1724923. Das ist die PID von meinem laufenden Skript xx.
Kommandos verketten
Man kann in einer Anweisung mehrere Kommandos angeben (verketten). Da jedes Kommando bei seiner Beendigung einen Exit Code zurückliefert, kann man mit Hilfe dieses Wertes die Abarbeitung der Verkettung steuern.
Der Exit Code eines Kommandos ist eine Zahl >=0 und kann direkt nach dem Ende des Kommandos in der Shell mit der Variablen $? abgefragt werden. Dabei bedeutet 0 ein erfolgreiches Ende des Kommandos und ungleich 0, das ein Fehler im Ablauf des Kommandos aufgetreten ist.
Kommandos bis zum ersten Fehler ausführen
Die Kommandos werden nacheinander ausgeführt, bis ein Fehler in einem Kommando auftritt.
Beispiel:
Kommandos bis zum ersten Erfolg ausführen
Die Kommandos werden nacheinander ausgeführt, bis das erste Kommando erfolgreich ausgeführt wurde.
Beispiel:
Kommandos verketten
Mit dem Zeichen ; können Kommandos verkettet werden
Alle Kommandos werden nacheinander ausgeführt - egal ob ein Fehler aufgetreten ist oder nicht.Shell Eigenschaften
Environmentvariablen
Shellvariablen sind nur in der aktuelle Shell bekannt. Environmentvariablen dagegen werden an alle Subprozesse der Shell vererbt. Ein Subprozess ist ein Prozess, der von der aktuellen Shell gestartet wurde. Eine Variable wird zu einer Environmentvariablen, indem man sie mit export deklariert:
Oder auch länger:
All derzeit deklarierten Environmentvariablen kann man sich mit dem folgenden Kommando ausgeben lassen:
Die folgenden Environmentvariablen sind in der Shell immer gesetzt:
- HOME Enthält das Homeverzeichni des Benutzers
- PATH
Enthält (durch : getrennt) alle Verzeichnisse, in denen die Shell nach einem Kommando sucht.
alias / unalias
Mit alias kann man sich ein eigenes Kommando builden.
Gibt man ll ein, wird das Kommando ls -l ausgeführt. Gibt man bilder ein, wird die Kommandoverkettung cd $HOME/Bilder;pwd ausgeführt.
Mit unalias kann man ein vorher erzeugtes Alias läschen.
Gibt man nur alias ein, werden alle deklarierten Aliases angezeigt.
History
Die Shell führt eine History der aufgerufenen Kommandos.
history : anzeigen der History
Strg + R : suchen in History
!! : letztes Komando wiederholen
Kommando !! : Kommando mit dem letzten Kommando als Argument ausführen
TLDR (Too Long Didn't Read)
Die gesamte TLDR Umgebung ist im GitHub unter der Kennung tldr pages abgelegt. Der Standard Client ist ein Python Skript (tldr-python-client). Auf dieser Seite gibt es auch eine Beschreibung zur Konfiguration und dem Aufruf des Clients. Die von tldr ausgegeben Texte sind im Repository tldr-pages/tldr abgelegt.