Einführung in die Umgestaltung von Shell -Shells
- 4836
- 956
- Tom Jakobs
Zielsetzung
Lernen Sie, Umleitungen, Rohre und T -Shirt in der Bash -Schale zu verwenden
Betriebssystem- und Softwareversionen
- Betriebssystem: - Linux -Verteilung Agnostisch
Anforderungen
- Zugang zu einer Bash -Hülle
Konventionen
- # - erfordert, dass gegebene Linux -Befehle mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mit Verwendung von ausgeführt werden können
sudo
Befehl - $ - Erfordert, dass die angegebenen Linux-Befehle als regelmäßiger nicht privilegierter Benutzer ausgeführt werden können
Einführung
Umleitung ist die Möglichkeit, die Eingabe und Ausgabe verschiedener Befehle nach und von Dateien oder Geräten umzuleiten. Wir werden sehen.
Dateideskriptoren
Jedes Mal, wenn Sie ein Programm ausführen, drei Dateideskriptoren
werden standardmäßig erstellt:
- 0 -
Stdin
(Standardeingang) - 1 -
Stdout
(Standardausgabe) - 2 -
Stderr
(Standart Fehler)
Standardmäßig die Stdout
Und Stderr
Deskriptoren werden an den Bildschirm „angeschlossen“, was bedeutet, dass die Programmausgabe und ihre Fehler in keiner Datei gespeichert, sondern nur angezeigt werden, während die Standardeingabe an die Tastatur angehängt wird. Umleitungsbetreiber lassen uns diese Verbände manipulieren.
Standardausgabe umleiten
Wie oben erwähnt, wird standardmäßig die Standardausgabe eines Programms an den Bildschirm gesendet, aber unter bestimmten Umständen, wie zum Beispiel im Kontext eines Skripts, möchten wir es möglicherweise verwerfen oder an eine Datei senden. Wie erreichen wir das?? Der Schlüssel hier ist der> Operator:
ls -l> Ausgabe.txt
In diesem kleinen Beispiel haben wir die Ausgabe der Ausgabe umgeleitet ls
Befehl zur Dateiausgabe.TXT (Beachten Sie, dass die Datei nicht existieren muss, sie wird automatisch erstellt). Auf dem Bildschirm erschien nichts, aber wenn wir den Inhalt der Datei überprüfen, werden wir etwas ziemlich Vertrautes sehen:
$ CAT -Ausgabe.TXT insgesamt 36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Desktop DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Dokumente DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 23 02:40 Downloads DRWXRWXR-X. 13 EGDOC EGDOC 4096 Jun 23 08:13 GIT DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Musik -rw-rw-r--. 1 EGDOC EGDOC 0 Jun 23 09:38 Ausgabe.txt drwxr-xr-x. 2 EGDOC EGDOC 4096 22. Juni 19:39 Bilder DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Public DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Vorlagen DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Videos
Was wir sehen, ist die Ausgabe der ls
Befehl. Wenn wir jetzt die Umleitung erneut versuchen, wird der aktuelle Inhalt der Datei durch die neue Ausgabe ersetzt. Wie können wir den vorherigen Inhalt bewahren und nur anhängen neue Zeilen dazu? In diesem Fall verwenden wir die >>
Operator:
ls -l >> Ausgabe.txt
Auf diese Weise hat die Umleitung den gleichen Effekt, als ob wir die verwenden, wenn die Datei nicht vorhanden ist oder keinen Inhalt hat >
Bediener, ansonsten wird der neue Inhalt der vorhandenen beigefügt, wie Sie die Datei erneut beobachten können:
Insgesamt 36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Desktop DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Dokumente DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 23 02:40 Downloads DRWXRWXR-X. 13 EGDOC EGDOC 4096 Jun 23 08:13 GIT DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Musik -rw-rw-r--. 1 EGDOC EGDOC 0 Jun 23 09:38 Ausgabe.txt drwxr-xr-x. 2 EGDOC EGDOC 4096 22. Juni 19:39 Bilder DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Public DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Vorlagen DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Videos insgesamt 40 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Desktop DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Dokumente DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 23 02:40 Downloads DRWXRWXR-X. 13 EGDOC EGDOC 4096 Jun 23 08:13 GIT DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Musik -rw-rw-r--. 1 EGDOC EGDOC 541 Jun 23 09:38 Ausgabe.txt drwxr-xr-x. 2 EGDOC EGDOC 4096 22. Juni 19:39 Bilder DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Public DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Vorlagen DRWXR-XR-X. 2 EGDOC EGDOC 4096 22. Juni 19:36 Videos
Möglicherweise müssen wir auch die Ausgabe mehrerer Befehle gleichzeitig umleiten: Wir können das gewünschte Ergebnis mit Curly -Zahnspangen erhalten, um sie zu gruppieren:
$ echo "LinuxConfig"; ls -l; > Ausgabe.txt
Die Ausgabe.TXT -Datei enthält jetzt sowohl die Zeichenfolge "Linuxconfig" als auch das Ergebnis der ls -l
Befehl.
Ein weiterer gängiger Betrieb besteht darin, die Ausgabe eines Befehls vollständig zu verwerfen, diesmal zu einem speziellen Gerät umleitet: /dev /null. In unix-ähnlichen Betriebssystemen /dev/null
(Auch als Bit Bucket bekannt) ist ein Gerät, das alle darauf geschriebenen Daten verwaltet:
ls -l> /dev /null
Sowohl die Standardausgabe als auch den Standardfehler umleiten
In den obigen Beispielen haben wir gerade den Standardausgang umgeleitet. Wenn ein Fehler auftritt, können wir immer noch die Fehlermeldung auf dem Bildschirm sehen:
$ ls -l nicht vorhanden.txt> /dev /null ls: kann nicht zugreifen 'nicht vorhanden.txt ': Keine solche Datei oder Verzeichnis
Dies geschieht, weil, wie oben gesagt, Stdout
Und Stderr
Deskriptoren werden vollständig voneinander getrennt. Was können wir dann tun, um sie beide umzuleiten?? Es gibt zwei Syntaxe, mit denen wir diese Aufgabe erledigen können: Die erste, die auch in alten Versionen der Shell funktioniert, ist das folgende:
ls -l> Ausgabe.txt 2> & 1
Was haben wir getan? Erstens haben wir die umgeleitet Stdout
des Befehls zur Ausgabe.TXT -Datei, genau wie zuvor, dann haben wir die umgeleitet Stderr
zum Stdout
. Bitte beachten Sie, wie wir auf Dateideskriptoren nach ihren jeweiligen Zahlen verwiesen haben. Für eine einigermaßen moderne Bash -Version können wir diese andere, optimiertere Syntax verwenden:
ls -l &> Ausgabe.txt
Die Standardausgabe auf Standardfehler umleiten
Stellen Sie sich vor. Wie würden Sie das erreichen?? Das erste, was mir in den Sinn kommt, ist nur zu tun Echo
Die gesuchte Nachricht und dann wahrscheinlich das Skript mit dem entsprechenden Fehlercode beenden. Dies wäre vollkommen in Ordnung, aber fragen Sie sich, welchen Deskriptor diese Nachricht "gesendet" wird "? Es ist der Stdout
des Echo
Der Befehl, aber gleichzeitig sollte es als Fehlermeldung die Dinge aus der Skriptperspektive sehen, die die Verwendung des Stderr
Deskriptor. Was wir hier tun wollen, ist umzuleiten Stdout
Zu Stderr
. Wir verwenden die folgende Syntax, um die Aufgabe zu erfüllen:
echo "Es ist ein Fehler aufgetreten, Tschüss!"> & 2
Sicherlich ist es nicht die nützlichste der Fehlermeldungen, aber es reicht für unser Beispiel aus.
Standardeingabe umleiten
Wie bereits erwähnt, ist die Standardeingabe standardmäßig der Tastatur zugeordnet, aber mit der Verwendung des <
Betreiber können wir einige Programme erstellen, um Eingaben aus anderen Quellen zu akzeptieren. Lassen Sie uns ein kurzes Beispiel mit dem sehen tr
Befehl (wie Sie wahrscheinlich wissen tr
wird verwendet, um Zeichen zu löschen oder zu übersetzen). Es funktioniert normalerweise so:
Tr 'Goot Tay!'t d
Sie geben tr
Eine Zeichenfolge, die zuerst das Zeichen angibt, das Sie ändern möchten, und dann diejenige, mit der sie es ersetzen sollte. In diesem Fall passieren wir die String 'Goot Tay!'Direkt mit der Tastatur: Es wird in einen guten Tag übersetzt!''. Was wir tun werden, um zu demonstrieren Stdin
Umleitung soll die Zeichenfolge in eine Datei schreiben und dann den Inhalt der Datei in die umleiten Stdin
des tr
Befehl.
Zuerst schreiben wir 'Goot Tay!'Zum Ausgang.TXT -Datei
$ echo 'goot tay!'> Ausgabe.txt
Dann senden wir seinen Inhalt an die Stdin
von tr
:
$ tr < output.txt t d good day!
Wie Sie sehen können, lief alles wie erwartet, und eine schöne Nachricht wurde auf dem Bildschirm gedruckt.
Pipelines
Mit dem Rohroperator |
Wir können mehrere Befehle zusammenketten, damit die Stdout
des Befehls links vom Bediener wird an die übergeben Stdin
des Befehls rechts davon. Wir können dies schnell demonstrieren, indem wir die verwenden tr
Befehl noch einmal:
$ echo 'Goot -Tag!'| Tr t d Guter Tag!
Was ist passiert? Die Standardausgabe des Echo -Befehls (bestehend aus der String 'Goot Tay!') Ist leitete
zum Standardeingang der tr
Befehl, der die Zeichenfolge übersetzt. Schließlich sehen wir tr
Standardausgabe auf dem Bildschirm. Aber natürlich kann die Pfeife fortgesetzt werden. Stellen Sie sich vor, wir wollen, dass nur das Wort "Gut" angezeigt wird:
$ echo 'goot tay!'| Tr t d | Cut -f 1 -d "schneiden
Was wir hier getan haben, ist, das hinzuzufügen schneiden
Befehl an die Pfeife, übergeben die Stdout
von tr
zu seinem Stdin
. Der schneiden
Der Befehl verwendet den Raum als Trennzeichen (-D
Switch) und wählt nur das erste Feld aus, wobei die Zeichenfolge "Gut" zurückgegeben wird.
Verwenden von Tee
Der Tee
Der Befehl liest die Standardeingabe und leitet es sowohl in die Standardausgabe als auch in eine Datei um, wobei er möglich ist, um in unserer Pipe ein 'T' zu erstellen. Lassen Sie uns das obige Beispiel wiederverwenden und diesmal das Zwischenergebnis senden (Guten Tag!') auch zum Ausgang.TXT -Datei:
$ echo 'goot tay!'| Tr t d | T -Shirt Ousput.txt | Cut -f 1 -d "schneiden
Die Ausgabe auf dem Bildschirm ist der gleiche wie zuvor („gut“), aber wenn wir die Ausgabe lesen.TXT -Datei können wir sehen, dass der gute Tag!'String wurde darauf geschrieben. Das liegt daran, dass „guter Tag!'War der Standardausgang, der in das Rohr fließte, als wir unsere einfügten Tee
.
Tee
ist auch nützlich sind einige spezifische Umstände. Wenn Sie beispielsweise versuchen, etwas in eine Datei zu „wiederholen“, die Root -Berechtigungen benötigt, um zu schreiben, werden Sie feststellen, dass die Dinge nicht wie erwartet verlaufen:
$ sudo echo "linuxconfig.org "> geschützt.txt -bash: geschützt.TXT: Erlaubnis abgelehnt
Was ist passiert? Sie haben wahrscheinlich erwartet, dass der Befehl erfolgreich ist, weil Sie ihn mit sudo vorangestellt haben, aber er ist trotzdem gescheitert. Das liegt daran, dass Sie gerade das ausgeführt haben Echo
Befehl mit Privilegien, aber das gab Ihnen keine Schreibberechtigungen in der Datei. Versuchen wir es stattdessen so:
$ echo "Linuxconfig.org "| sudo tee geschützt.txt> /dev /null
Hier führen wir Echo als normaler Benutzer aus, aber die Umleitung selbst wird mit Root -Privilegien durchgeführt, sodass diesmal der Befehl erfolgreich ist. Wir haben auch eine zusätzliche Umleitung hinzugefügt zu /dev/null
, Weil wir die Ausgabe nicht mussten, um auf dem Bildschirm angezeigt zu werden.
Beachten Sie, dass die Ausgabe mit dieser Technik nicht an die Zieldatei angehängt wird: Letzteres wird überschrieben und der vorherige Inhalt wird verloren gehen. Um der Datei anzuhängen, müssen wir die hinzufügen -A
wechseln zu Tee
(kurz für -Append).
Seien Sie vorsichtig, nur ein wenig Ablenkung hier kann schreckliche Dinge verursachen!
Verwandte Linux -Tutorials:
- Dinge zu installieren auf Ubuntu 20.04
- Eine Einführung in Linux -Automatisierung, Tools und Techniken
- Einführung in genannte Pipes auf Bash Shell
- Umgang mit Benutzereingaben in Bash -Skripten
- Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
- Mastering -Bash -Skriptschleifen beherrschen
- Linux -Konfigurationsdateien: Top 30 am wichtigsten
- Mint 20: Besser als Ubuntu und Microsoft Windows?
- Kann Linux Viren bekommen?? Erforschung der Verwundbarkeit von Linux…
- Linux -Download