Kombination von Befehlen: Unterschied zwischen den Versionen

Aus Info-Theke
Zur Navigation springen Zur Suche springen
K (1 Version)
Zeile 1: Zeile 1:
[[Kategorie:Tutorials]]
[[Kategorie:Tutorial:Konsole]]
[[Übersicht über das Konsolen-Tutorial]]
[[Übersicht über das Konsolen-Tutorial]]
==Vorbemerkung==
==Vorbemerkung==

Version vom 10. September 2011, 12:09 Uhr

Übersicht über das Konsolen-Tutorial

Vorbemerkung

Eine der Stärken des Nutzens einer Konsole ist die Möglichkeit, die hochspezialisierten Einzelkommandos zu kombinieren.

Dateiumleitung

Viele Programme verwenden nur einen Eingabe- und einen Ausgabekanal, genannt stdin und stdout. Standardmäßig ist der Eingabekanal mit dem Eingabebereich der Shell verbunden, der Ausgabekanal mit der Ausgabe der Shell.

Mit dem Zeichen '>' wird der Ausgabekanal in die Datei umgeleitet, die dem '>' folgt. Ein '>>' erzeugt keine neue Datei, wenn schon eine existiert, sondern hängt den Inhalt an den vorhandenen.

Mit dem Zeichen '<' wird der Eingabekanal mit dem Inhalt der Datei "gefüttert", deren Name dem '<' folgt.

Hinweis: Es gibt da noch stderr, aber das gehört nicht zum Grundkurs.

Beispiel

cat ist ein Programm, das von stdin liest und nach stdout ausgibt. Rufen wir cat ohne Parameter auf, geht der Cursor in die nächste Zeile und dann passiert scheinbar gar nichts. Der Grund ist, das Programm wartet auf Eingaben. Wir geben z.B. "Zeile 1" ein und drücken Enter. Sofort wird genau dieser Text "Zeile 1" nochmal ausgegeben, denn cat gibt ja alles, was auf stdin hereinkommt, wieder auf stdout (also auf die Konsole) aus. Wenn wir cat signalisieren wollen, dass die Eingabe beendet ist, müssen wir das Spezialzeichen Strg-d ("Dateiende") am Zeilenanfang eingeben. Dann beendet sich cat.

Wir leiten jetzt den Ausgabekanal in die Datei "test.txt" um:

 cat >test.txt

Wieder erscheint der Cursor in der nächsten Zeile, das Programm wartet auf Eingabe.

Wir geben ein: "Zeile 1", Enter, "Zeile 2", Enter, Strg-d Diesmal wiederholt cat den eingegeben Text nicht, denn der Ausgabekanal ist ja die Datei test.txt. Dort findet sich der eingegebene Text.

Jetzt noch der umgekehrte Weg: Wir leiten den Inhalt der Datei in das Programm cat, das diesen dann ausgibt:

 cat <test.txt
Zeile 1
Zeile 2

Anwendungsbeispiel

Wir wollen uns merken, wie die Partitionstabellen aller Festplatten aussehen, um bei einem Schadensfall diese evt. reparieren zu können. Das Programm fdisk zeigt uns diese Daten an. Um sie aufzuheben, leiten wir die Ausgabe in eine Datei um:

 fdisk -l >/home/hardware-info/partitionen_2011_09_08.txt

Here-Dokument

Der einfachste Weg, einen mehrzeiligen Text in eine Datei zu schreiben, ist das sogenannte Here-Dokument, das mit <<MARKE eingeleitet und mit MARKE beendet wird. Dies ist vor allem bei Tutorials und in Scripts nützlich.

Beispiel

cat <<EOS >hits_of_deep_purple.txt
Child in Time
Smoke on the Water
Highway Star
EOS

Wird die Form <<'MARKE' verwendet, erfolgt keine Expansion von Shell-Variablen, ein '$' wird also als '$' ausgegeben.

cat <<'EOS' >readme.txt
Ein Dollar ('$') ist das Symbol für die US-Währung.
EOS

Verkettung (Pipelining)

Soll die Ausgabe eines Programms die Eingabe eines anderen Programmes sein, so geht dies mit dem Zeichen '|'. Dies kann zwar auch mit Dateiumleitung erreicht werden, ist aber so viel einfacher und braucht auch keinen Plattenplatz (ist bei großen Datenmengen ein wichtiger Grund).

Folgende Konstrukte sind (bis auf den Platzbedarf) äquivalent:

 ls -1 >/tmp/dateien
 wc -l </tmp/dateien

Das Kommando "ls -1" listet alle Dateien des aktuelle Verzeichnisses auf, jede Datei in einer Zeile. Das Kommando wc -l zählt die Zeilen der Eingabe. Das Ergebnis ist die Anzahl der Dateien im aktuellen Verzeichnis.

Jetzt das ganze mit Verkettung:

 ls -1 | wc -l

Ist das nicht kurz und bündig?

Hinweis: Die Option von ls ist die Zahl 1, die Option von wc ist der kleine Buchstabe l.

Bedingte Ausführung

Manchmal ist es sinnvoll, einen Befehl auszuführen, wenn der vorausgehende Befehl erfolgreich war. Das wird mit dem Symbol '&&' erreicht:

 mount /media/usb && rsync -a /home /media/usb

Das Heimatverzeichnis wird nur dann auf den USB-Stick gesichert, wenn dieser erfolgreich eingebunden werden konnte.

In anderen Fällen ist es sinnvoll, einen Befehl nur dann auszuführen, wenn der vorausgehende Befehl nicht erfolgreich war. Das wird mit dem Symbol '||' erreicht:

 cp -a /etc /data/backup || echo "Problem beim Kopieren von /etc" >>/data/backup/log.txt

Wenn das Kopieren des Dateibaums von /etc einen Fehler aufwies, wird eine Meldung an eine Logdatei angehängt.

Befehlsliste

Es können auch mehrere Befehle in eine Zeile geschrieben werden, das Trennzeichen ist dann ';'

pushd /home/jonny ; tar czf /tmp/home.tgz ; popd

Verzeichnis wird gespeichert und ins Verzeichnis /home/jonny gegangen, ein Tar-Archiv erzeugt und das vorige Verzeichnis restauriert.