GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash-Umleitung mit Beispielen erklärt

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 0 10

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" fidone   

Ein 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 entdeckt

Bash 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

Linux
  1. So schreiben Sie ein Bash-Skript mit Beispielen

  2. Bash HereDoc Tutorial mit Beispielen

  3. Linux-cksum-Befehl für Anfänger erklärt (mit Beispielen)

  4. Bash-If-Else-Anweisung mit Beispielen

  5. So erstellen und mounten Sie das Btrfs-Dateisystem (mit Beispielen erklärt)

Bash-Scripting – Printf-Befehl mit Beispielen erklärt

Bash-Scripting – Assoziatives Array mit Beispielen erklärt

Bash-Scripting – Indiziertes Array mit Beispielen erklärt

Tr-Befehl in Linux mit Beispielen erklärt

Linux-Dateiberechtigungen und Eigentumsrechte mit Beispielen erklärt

Bash-Skript für Schleife mit Beispielen erklärt