Umleitung und Weiterleitung sind zwei nützliche Funktionen beim Bash-Skripting, die Systemadministratoren und Entwickler häufig verwenden. In diesem Leitfaden besprechen wir, was Bash-Umleitung ist und wie man mit Redirection in Bash mit Beispielbefehlen arbeitet.
Bevor Sie verstehen, wie die Umleitung funktioniert, ist es wichtig zu wissen, was ein Dateideskriptor ist.
Was ist ein Dateideskriptor?
Wenn Sie eine Datei unter Linux öffnen, wird jeder Datei eine ganze Zahl zugewiesen und diese Information wird im Kernel gespeichert. Auf diese Weise weiß der Kernel, welche Dateien geöffnet sind und welcher Prozess die Dateien geöffnet hat. Die zugewiesene Ganzzahl ist das, was wir Dateideskriptor (kurz FD) nennen.
Standardmäßig startet jedes Programm mit drei Dateideskriptoren.
- FD 0 -> Standardeingabe (stdin) -> Tastatur
- FD 1 -> Standardausgabe (Stdout) -> Anzeige (Terminal)
- FD 2 -> Standardfehler(Stderr) -> Anzeige(Terminal)
Sie können die Dateideskriptoren in /dev
sehen Verzeichnis:
$ ls -l /dev/std* lrwxrwxrwx 1 root root 15 Aug 27 21:32 /dev/stderr -> /proc/self/fd/2lrwxrwxrwx 1 root root 15 Aug 27 21:32 /dev/stdin -> /proc/self/fd/0lrwxrwxrwx 1 root root 15. August 27 21:32 /dev/stdout -> /proc/self/fd/1
Stdin (FD0) erhält Eingaben von der Tastatur. stdout (FD1) und stderr (FD2) werden an das Terminal gesendet. Wenn Sie Pipes und Umleitungen verwenden, können Sie die Art und Weise ändern, in der Eingaben weitergeleitet und Ausgaben und Fehler gesendet werden.
Ausgabe in eine Datei umleiten
Wie bereits erwähnt, werden Ausgabe (stdout) und Fehler (stderr) jedes Programms an das Terminal gesendet. Sie können den Umleitungsoperator ">" verwenden um stdout und stderr in eine Datei zu schreiben.
Schauen Sie sich das folgende Beispiel an. Ich verwende uname -mrs
Befehl und Umleiten der Ausgabe in eine Datei namens uname.log
.
$ uname -mrs> uname.log
$ cat uname.log
Linux 5.10.0-8-amd64 x86_64
Vorsicht: Bei Verwendung von ">"
Wenn die Datei nicht verfügbar ist, wird sie erstellt. Und wenn die Datei bereits existiert, wird sie mit neuen Inhalten überschrieben.
Sie können auch die Dateideskriptornummer für stdout(1) verwenden vor dem Umleitungsoperator, um die Ausgabe in eine Datei umzuleiten.
$ uname -mrs 1> uname.log
Wie ich bereits erwähnt habe, kann ein einzelner Umleitungsoperator (>
) überschreibt den Inhalt einer Datei nur, wenn die Datei bereits vorhanden ist. Wenn Sie jedoch den Inhalt anhängen möchten, anstatt dieselbe Datei zu überschreiben, verwenden Sie den doppelten Umleitungsoperator (z. B. >>
). Sie können hier auch den stdout-Dateideskriptor(1) verwenden.
$ whoami>> uname.log
$ echo $SHELL 1>> uname.log
$ cat uname.log Linux 5.10.0-8-amd64 x86_64ostechnix/bin/bash
Wie man mit Stderr umgeht
Jedes Programm generiert sowohl Ausgaben als auch Fehler und beide werden an das Terminal gesendet. In vielen Fällen möchten Sie den Fehler entweder ignorieren oder ihn isolieren und ihn zur Fehlerbehebung in eine separate Datei umleiten.
Nehmen wir ein einfaches Beispiel für die Ausführung von ls
Befehl, um zu sehen, wie das funktioniert. Ich versuche, zwei Dateien aufzulisten, von denen nur eine vorhanden ist. Ich bekomme sowohl meinen Fehler als auch die Ausgabe im Terminal, wie ich bereits sagte.
$ ls -l uname.log u1.log ls:Zugriff auf 'u1.log' nicht möglich:Keine solche Datei oder Verzeichnis-rw-r--r-- 1 ostechnix ostechnix 48 Aug 27 07:37 uname.log
Ich verwende dasselbe ls
Befehl erneut, aber dieses Mal wird die Ausgabe in eine Datei umgeleitet. Wie Sie der Ausgabe >
entnehmen können Der Operator leitet stdout(1) in eine Datei um, aber stderr(2) wird an das Terminal gesendet.
$ ls -l uname.log u1.log> ls.op ls:Zugriff auf 'u1.log' nicht möglich:Keine solche Datei oder Verzeichnis
Um stderr in eine Datei umzuleiten, verwenden Sie "2>"
Operator. Es ist zwingend erforderlich, den Dateideskriptor für stderr(2) vor dem Umleitungsoperator> zu verwenden, der den Fehler allein an eine Datei sendet.
$ ls -l uname.log u1.log> ls.op 2> ls.err
$ cat ls.err ls:Zugriff auf 'u1.log' nicht möglich:Keine solche Datei oder Verzeichnis
Jetzt werden stdout und stderr in separate Dateien geschrieben. Sie können stdout und stderr auch an eine einzelne Datei senden.
$ ls -l uname.log u1.log 1> ls.op 2> ls.op
Ab bash 4.4 , können Sie auch &>
verwenden signieren, um sowohl stdout als auch stderr in eine Datei umzuleiten.
$ ls -l uname.log u1.log &> ls.op
Was ist /dev/null?
Null ist eine spezielle Zeichendatei, die Eingaben akzeptiert und verwirft und keine Ausgabe erzeugt. Um es einfach auszudrücken:null verwirft alles, was Sie dorthin umleiten.
$ ls -l /dev/null crw-rw-rw- 1 root root 1, 3 Aug 27 06:01 /dev/null
Warum spielt die Null bei der Umleitung eine Rolle? Sie fragen sich vielleicht. In einigen Fällen möchten Sie möglicherweise stdout oder stderr nicht drucken oder speichern. In diesem Fall können Sie entweder stdout oder stderr nach /dev/null umleiten, wodurch der Eingabestrom verworfen wird.
$ date> /dev/null$ date 1> /dev/null # Stdout zu Null$ dateee 2> /dev/null # FALSCHER BEFEHL, Stderr zu Null$ date &> /dev/null # Stdout/Stderr zu Null
Eingabeumleitung in Bash
Ähnlich wie Sie die Ausgabe und den Fehler in eine Datei umleiten, können Sie auch Eingaben an einen Befehl übergeben, indem Sie den Eingabeumleitungsoperator (<
).
Beginnen wir mit einem einfachen Wortzählprogramm. Hier leite ich den Inhalt von ostechnix.txt
um Datei zur Wortanzahl, um die Anzahl der Zeilen zu ermitteln.
$ wc -l <ostechnix.txt 10
Sie können auch den stdin-Dateideskriptor (0) übergeben, wenn Sie die Eingabe umleiten.
$ wc -l 010
Sie können die Eingabe- und Ausgabeumleitungsoperatoren wie unten gezeigt kombinieren.
$ wc -l <ostechnix.txt &> /tmp/wc.op
$ cat /tmp/wc.op 10
Die Eingabeumleitung wird zusammen mit einer While-Schleife verwendet, um den Inhalt einer Datei Zeile für Zeile zu lesen.
Schauen Sie sich das folgende Beispiel an. Ich übergebe den /etc/passwd
Datei als Eingabe für while
Befehl. Hier den read
Der Befehl liest Zeile für Zeile und speichert sie in der Variablen VAL
und weiter unten in der Schleife wird die Bedingung geschrieben, um zu prüfen, ob der Benutzer verfügbar ist.
beim Lesen von VAL; do NAME=$(echo $VAL | awk -F ":" '/1/ {print $1}' ) if [[ $NAME ="karthick" ]] then echo "User spotted" fidoneEin Skript zum Suchen des Systembenutzers
Ersetzen Sie „karthick“ im obigen Code durch Ihren Systembenutzernamen. Speichern Sie die Datei und schließen Sie sie.
Dies ist kein optimaler Weg, um die Aufgabe zu erfüllen, den Benutzer zu finden, aber für Demonstrationszwecke reicht dies aus.
Machen Sie nun das Skript ausführbar und führen Sie es aus:
$ chmod +x ostechnix.sh$ ./ostechnix.sh
Benutzer entdecktBash unterstützt eine andere Form der Eingabeumleitung, bekannt als Heredoc . Weitere Einzelheiten finden Sie in der folgenden Anleitung:
- Bash Heredoc-Tutorial für Anfänger
Zusammenfassung
In diesem Handbuch haben wir einige wichtige Skriptkonzepte gelernt, z. B. was eine Bash-Umleitung ist, was ein Dateideskriptor ist, wie eine Ausgabe in eine Datei umgeleitet wird, wie mit stderr umgegangen wird, was /dev/null ist und wie es in Bash verwendet wird Umleitung, und schließlich haben wir die Anleitung mit der Eingabeumleitung in Bash beendet.
Wenn Sie Bash-Skripting lernen möchten, sollten Sie sich mit den hier erläuterten Konzepten vertraut machen. Um es sich bequem zu machen, empfehle ich Ihnen, alle Befehle, die wir in diesem Artikel gezeigt haben, in Ihrem System auszuprobieren.
Wenn Sie Feedback oder Tipps haben, die der Linux-Community und unseren Lesern beim Erlernen von Bash-Skripten helfen, können Sie uns dies gerne im Kommentarbereich unten mitteilen.
Empfohlene Lektüre:
- Bash-Scripting – Variablen mit Beispielen erklärt
- Bash-Scripting – Funktionen mit Beispielen erklärt
- Bash-Skripting – For-Schleife mit Beispielen erklärt
- Bash-Skripting – While- und Until-Schleife mit Beispielen erklärt
- Bash-Echo-Befehl mit Beispielen in Linux erklärt
- Die Liste nützlicher Bash-Tastaturkürzel
- Unterschied zwischen der Definition von Bash-Variablen mit und ohne Export