Einführung in die Umgestaltung von Shell -Shells

Einführung in die Umgestaltung von Shell -Shells

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