Bash-Doppelpfeife
In diesem Artikel werden Pfeifen und Doppelpfeifen ausreichend behandelt. Es werden die Verwendung, Notationen und Auswirkungen von Pipes in Bash-Befehlsskripten erörtert.
Im wirklichen Leben transportieren Rohre Flüssigkeiten oder Gas von einem Ort zum anderen. Aber in Bash transportieren Pipes nicht die Flüssigkeiten, sondern leiten die Ausgabe eines Befehls als Eingabe des folgenden Befehls weiter.
Pfeifen in Bash
Eine Pipe ist ein Umleitungsoperator, der die Ausgabe des Befehls an die Eingabe des unmittelbar folgenden Befehls überträgt. Das |
Symbol wird als Pipe in Bash verwendet.
Wir können auch sagen, dass in Linux/UNIX-Systemen eine Pipe die stdout
eines Befehls mit der stdin
des anderen Befehls verbindet.
Pipes werden auch verwendet, um zwei oder mehr Befehle zu kombinieren, bei denen die Ausgabe des vorherigen Befehls zur Eingabe des folgenden Befehls wird. Dieses Ding entfernt den Overhead der Dateinutzung.
Wenn wir einige zugehörige Informationen aus der Datei extrahieren müssen, speichern wir normalerweise zuerst die vorherige Ausgabe in der Datei und lesen aus der Datei, um den Dateistream in die erforderliche Ausgabe zu konvertieren.
In Pipes wird die Ausgabe eines Befehls jedoch direkt als Eingabe in den anderen Befehl eingespeist. Unten sehen Sie die grundlegende Notation des Befehls.
Comand-1 | command-2 | .... | command-N
Pipe zwischen ls
und grep
hinzufügen
Jetzt sehen wir das Beispiel, in dem eine Pipe die Ausgabe eines Befehls mit der Eingabe des folgenden Befehls verbindet. In diesem Beispiel wählen wir die gewünschte Datei anhand ihres Namens aus einer Reihe von Dateien in einem bestimmten Verzeichnis aus.
Öffnen Sie einfach das Terminal und gehen Sie in das Verzeichnis, in dem Sie die Datei abgelegt haben, und schreiben Sie den Befehl ls
darauf. Der Befehl ls -l
listet die Details der ausgewählten Verzeichnisdateien auf.
Unser Ziel ist es jedoch, die Ausgabe von ls -l
auszuwählen, eine Pipe hinzuzufügen und nach einem bestimmten Dateinamen zu suchen, damit die Ausgabe möglicherweise nur die erforderliche Datei enthält.
Listen Sie nach dem Code zunächst die Namen aller Dateien in einem bestimmten Verzeichnis auf.
ls -l
Das aktuelle Verzeichnis hat drei Dateien; Ihre Details werden im Screenshot angezeigt. Uns interessieren jedoch die Details der Datei bash_double_pipe.md
.
Wir werden die Pipe verwenden und diese Datei mit ihrem Namen grep
.
Der folgende Code zeigt die Details der bash_double_pipe.md
.
ls -l | grep "bash_double_pipe.md"
Vermeiden Sie I/O-Umleitung mit Pipes
Pipes verwenden während der Umleitungen nicht die Standardeingabe oder -ausgabe. Pipes sind im Hauptspeicher implementiert.
Das folgende Beispiel zeigt die Stream-Umleitung mit und ohne Pipes.
E/A-Umleitung ohne Pipe
ls -l > temp
more < temp
Der oben angegebene Code leitet die Ausgabe des ls -l
auf die temp
-Datei um und zeigt dann den Inhalt der temp
-Datei auf dem Bildschirm an. Der folgende Screenshot zeigt die Ausgabe des obigen laufenden Codes.
Jetzt untersuchen wir die IO-Umleitung, ohne die Standardeingabe oder -ausgabe der Pipe zu verwenden. Das obige Beispiel leitet die Ausgabe des ersten Befehls an die Eingabe des zweiten Befehls um.
Der folgende Code dient demselben IO-Umleitungsvorgang, verwendet jedoch eine Pipe.
ls -l | more
Der obige Code führt denselben Umleitungsvorgang ohne Festplatten-E/A aus. Der folgende Screenshot zeigt die Ergebnisse des obigen Ausführungsbefehls.
Der obige Screenshot zeigt, dass wir Umleitungen mit der Pipe ohne Disk-IO durchführen können.
Verwenden Sie Pipe für die Befehle cat
, grep
, tee
und wc
Pipes sind auch sehr nützlich in den Befehlen cat
, grep
, tee
und wc
. Angenommen, wir möchten sehen, wie oft ein Datensatz in der Datei vorkommt.
Anstatt viele Variablen zu erstellen, müssen wir dann die Pipe zwischen diesen Befehlen verwenden und die erforderliche Ausgabe erhalten.
Der folgende Code zeigt die Verwendung der Befehle cat
, grep
, tee
und wc
zusammen mit den Pipes.
cat abc.txt | grep "temp" | tee file2.txt | wc -l
Der Befehl cat
übergibt den gesamten Inhalt der abc.txt
und übergibt an den Befehl grep
. Der grep
-Befehl pickt nur die Zeilen mit dem passenden String mit dem temp
heraus.
Dann werden die Zeilen, die den temp
-String enthalten, an den tee
-Befehl übergeben, der die Ausgabe in die file2.txt
schreibt.
Danach wird diese Ausgabe an den Befehl wc
übergeben, der die Nummer des darin enthaltenen Datensatzes zählt. Die file2.txt
hat drei Zeilen; Die Ausgabe des obigen Befehls ist 3.
Zusammenfassend lässt sich sagen, dass Pipes sehr nützlich sind, um die Ausgabe eines Befehls an die Eingabe des folgenden Befehls zu übertragen.
Unterschied zwischen Einzelrohr und Doppelrohr
Einzelrohr |
sendet die Ausgabe eines Befehls an die Eingabe des nächsten Befehls, aber doppelte Pipe ||
ist dem Einzelrohr nicht ähnlich. Double Pipe stellt den Operator ODER
dar und wird im Allgemeinen in bedingten Anweisungen verwendet.
Syntax von ODER
-Operator und Kurzschlussauswertung
Der folgende Code zeigt die grundlegende Notation der Doppelpipe.
command-1 || command-2
Der obige Code zeigt die grundlegende Notation und Verwendung des ||
Operator. Bash unterstützt die Kurzschlussauswertung.
Die Kurzschlussauswertung bedeutet, dass die Auswertung einer Bedingung stoppt und die endgültige Entscheidung zurückgibt, sobald sie klar wird. Beispielsweise stoppt eine zusammengesetzte Bedingung mit mehreren Ausdrücken, die mit dem Operator ODER
kombiniert sind, sobald sich herausstellt, dass einer der Ausdrücke true
ist.
Andere Ausdrücke werden nicht weiter bewertet, da ihre Ergebnisse die endgültige Entscheidung nicht mehr beeinflussen.
Daher versucht der Bash-Interpreter, den ersten Befehl im obigen Bash-Skript auszuführen. Wenn der erste Befehl erfolgreich ausgeführt wird, wird Befehl-2
nicht ausgeführt.
Der zweite Befehl wird nur ausgeführt, wenn der erste Befehl nicht erfolgreich ausgeführt wird.
Betrachten wir das Beispiel des Doppelrohrs.
ls -a || echo "hello world"
Im obigen Skript listen wir in command-1
die Elemente des aktuellen Verzeichnisses auf. Während wir uns in command-2
befinden, drucken wir die Nachricht hello world
.
Wir haben die doppelte Pipe zwischen diesen beiden Befehlen verwendet. Wenn wir den obigen Befehl ausführen, listet Befehl-1
erfolgreich die Elemente des aktuellen Verzeichnisses auf, und deshalb wird Befehl-2
ignoriert.
Lassen Sie uns nun das Szenario untersuchen, in dem command-1
nicht erfolgreich ausgeführt wird.
ls a || echo "hello world"
Der obige Befehl zeigt das Szenario, in dem der zweite Befehl ausgeführt wird. Im ersten Befehl haben wir einen Bindestrich (-
) vor dem a
-Flag versäumt; Daher wird dieser Befehl nicht erfolgreich ausgeführt.
Der ODER
-Operator führt also den echo
-Befehl aus, der die hello world
-Nachricht ausgibt.
Der folgende Screenshot zeigt die Ausgabe der beiden obigen Befehle.
Die obige Idee kann erweitert werden, um eine beliebige Anzahl von Befehlen zu verketten. Beispielsweise verkettet das folgende Skript vier Befehle mit dem ||
Operator, und die Auswertung beginnt von links nach rechts.
Sobald ein Befehl erfolgreich ausgeführt wurde, werden alle verbleibenden Befehle auf der rechten Seite übersprungen.
Command-1 || Command-2 || Command-3 || command-4
Abschluss
In diesem Artikel wurden Einzel- und Doppelrohrschilder und ihre Funktionalitäten besprochen. Das einzelne Pipe-Symbol stellt die Linux-Pipe dar, die die Ausgabe eines Befehls an die Eingabe eines anderen überträgt.
Andererseits ist das doppelte Pipe-Zeichen ein logischer ODER
-Operator und hilft bei logischen Operationen.