8.2 Die Kommandozeile
8.2.1 Programme starten
Es ist schwierig etwas zu erreichen ohne ein Programm auszuführen; Sie könnten etwas mit Ihrem Computer abstützen oder eine Tür aufhalten und er könnte das schönste brummende Geräsch machen wenn er läuft, aber das wäre auch schon alles. Und ich glaube wir können uns alle darauf einigen das der Gebrauch als brummender Türstopper den Computer nicht zu der Popularität verholfen hat die er heute hat.
Nun, Sie erinnern sich daran das fast alles in Linux eine Datei ist? Nun, das ist auch für Programme so. Jeder Befehl den Sie ausführen (sofern er nicht in die Shell eingebaut ist) befindet sich irgendwo in einer Datei. Sie führen ein Programm einfach aus indem Sie den vollen Pfad dazu angeben.
Zum Beispiel, erinnern Sie sich an den su Befehl des letzten Abschnitts? Nun, er befindet sich genau genommen im /bin Verzeichnis: /bin/su würde ihn problemlos ausführen.
Nun, warum funktioniert es dann wenn man einfach su eingibt? In der Tat haben Sie nicht angegeben das es in /bin liegt. Es hätte doch genau so gut in /usr/local/share liegen können, richtig? Wie konnte es das wissen? Die Antwort darauf liegt in der PATH Umgebungsvariablen; die meisten Shells haben entweder PATH oder etwas sehr ähnliches wie PATH. Sie enthält im Grunde genommen eine Liste von Verzeichnissen, in denen nach Programmen geschaut werden soll, die Sie ausführen wollen. Als Sie su ausgeführt haben ist Ihre Shell durch seine Liste mit den Verzeichnissen gegangen und hat jedes nach einer ausführbaren Datei, mit dem Namen su, geprüft, die sie ausführen könnte; die erste die sie erreicht hat, hat sie ausgeführt. Das passiert immer wenn Sie ein Programm starten ohne den vollen Pfad dazu anzugeben; wenn Sie einen "Befehl nicht gefunden" Fehler bekommen, dann bedeutet das nur das das Programm, das Sie ausführen wollten, nicht in ihrem PATH ist. (Das würde natürlich zutreffen wenn das Programm überhaupt nicht existiert...) Wir werden die Umgebungsvariablen ausführlicher in Abschnitt 8.3.1 diskutieren.
Denken Sie auch daran das "." eine Kurzform für das aktuelle Verzeichnis ist. Wenn Sie also in /bin sein sollten, dann würde ./su als expliziter voller Pfad funktionieren.
8.2.2 Wildcard Matching
Nahezu jede Shell erkennt einige Zeichen als Ersatz oder Abkürzung die bedeutet das hier etwas hingehört. Solche Zeichen werden passend wildcards genannt; die gängisten sind * und ?. Nach Vereinbarung steht ? normalerweise für irgendein einzelnes Zeichen. Zum Beispiel, nehmen wir an Sie befinden sich in einem Verzeichnis mit drei Dateien: ex1.txt, ex2.txt und ex3.txt. Sie wollen all diese Dateien in ein anderes Verzeichnis kopieren (mit dem cp Befehl den wir in Abschnitt 10.5.1 behandeln), nehmen wir an nach /tmp. Nun, tippen von cp ex1.txt ex2.txt ex3.txt /tmp ist viel zu viel Arbeit. Es ist viel einfacher cp ex?.txt /tmp zu tippen; das ? entspricht jedem der Zeichen "1", "2", und "3", und jedes in dieser Reihe wird eingefügt.
Sie fragen sich was das soll? Das ist immer noch zu viel Arbeit? Sie haben Recht. Es ist entsetzich; wir haben Arbeitsgesetze die uns vor solchen Dingen schützen sollen. Erfreulicherweise haben wir auch *. Wie bereits erwähnt entspricht * "jede Anzahl von Zeichen", inklusive 0. Wenn also diese drei Dateien die einzigen im Verzeichnis gewesen wären, dann hätten wir einfach cp * /tmp sagen können und hätte alle auf einem Schlag erwischt. Gehen wir aber davon aus, dass es auch eine Datei mit dem Namen ex.txt und eine mit dem Namen hejaz.txt gibt. Wir wollen ex.txt aber nicht hejaz.txt kopieren; cp ex* /tmp wird das für uns tun.
cp ex?.txt /tmp, würde natürlich nur die originalen drei Dateien erwischen weil es kein Zeichen in ex.txt gibt das dem ? entsprechen würde, also würde sie weggelassen.
Ein weiteres übliches wildcard ist das Klammernpaar [ ]. Alle Zeichen innerhalb der Klammern wird an Stelle des [ ] eingesetzt um Treffer zu finden. Hört sich verwirrend an? Es ist nicht so schlimm. Nehmen wir zum Beispiel an, dass wir ein Verzeichnis ahben das die folgenden 8 Dateien enthält: a1, a2, a3, a4, aA, aB, aC, und aD. Wir wollen nur die Dateien die in Zahlen enden; [ ] wird das für uns tun.
% ls a[1-4] a1 a2 a3 a4
Aber was wir wirklich wollen ist a1, a2, und a4? Im vorigen Beispiel haben wir - genutzt das allen Werten zwischen 1 und 4 entspricht. Wir können auch einzelne Einträge mit Kommas trennen.
% ls a[1,2,4] a1 a2 a4
Ich weiß was Sie jetzt denken, "was ist mit Buchstaben?" Linux ist I know what you're thinking now, “Well what about letters?” Linux unterscheidet zwischen Groß- und Kleinschreibung, was bedeutet das a und A verschiedene Zeichen sind und nur nach Ihrem Gefühl etwas miteinander zu tun haben. Großbuchstaben kommen immer vor Kleinbuchstaben, deshalb kommt A und B vor a und b. Um mit unserem früheren Beispiel fortzusetzen, wenn wir die Dateien a1 und A2 wollten, dann können wir diese schnell mit [ ] finden.
% ls [A,a]1 A1 a1
Beachten Sie, dass wir falsche Ergebnisse bekommen hätten wenn wir einen Bindestrich statt des Kommans verwendet hätten.
ls [A-a]1 A1 B1 C1 D1 a1
Sie können auch Bindestrich- und Kommazeichenfolgen kombinieren.
% ls [A,a-d] A1 a1 b1 c1 d1
8.2.3 Eingabe-/Ausgabeweiterleitung und Pipen
(Hier kommt etwas tolles.)
% ps > blargh
Wissen Sie was das ist? Das bin ich beim Ausführen von ps um zu sehen welche Prozesse laufen; ps wird in Abschnitt 11.3 behandelt. Das ist nicht der tolle Teil. Der tolle Teil ist das > blargh, welches bedeutet, grob gesagt, nimm die Ausgabe von ps und schreibe sie in eine Datei die blargh heißt. Aber warte, es wird noch toller.
% ps | less
Dieser nimmt die Ausgabe von ps und leitet (piped) sie durch less. So kann ich nach Belieben durchscrollen.
% ps >> blargh
Dies ist die dritte oft genutzte Möglichkeit der Weiterleitung. Es macht das gleiche wie ">", außer das ">>" die Ausgabe von ps an die Datei blargh anhängt, wenn besagte Datei existiert. Wenn nicht, dann wird wie mit ">" die Datei erstellt. (“>” wird die aktuellen Inhalte von blargh auslöschen.)
Es gibt auch einen “<” Operator, welcher bedeutet "nehme deine Eingabe aus dem folgenden", aber es wird nicht annähernd so oft genutzt.
% fromdos < dosfile.txt > unixfile.txt
Weiterleitung beginnt wirklich Spaß zu machen wenn man beginnt sie zu stapeln:
% ps | tac >> blargh
Dieser wird ps starten, die Reihenfolge der Zeilen seiner Ausgabe umdrehen und diese zur Datei blargh hinzufügen. Sie können so viele von diesen zusammenstecken wie Sie wollen; denken Sie nur daran das sie von links nach rechts interpretiert werden.
Schauen Sie in die bash(1) man page für detailliertere Information zur Weiterleitung.