Im vorherigen Beitrag haben wir ausführlich über die Parameter und Optionen gesprochen. Heute werden wir über etwas Wesentliches beim Shell-Scripting sprechen, nämlich Eingabe, Ausgabe und Umleitung.
Sie können die Ausgabe Ihrer Shell-Skripte auf zwei Arten anzeigen:
- Ausgabe auf dem Bildschirm anzeigen.
- Ausgabe in eine Datei senden.
Standarddateideskriptoren
Alles ist eine Datei in Linux, und das schließt Ein- und Ausgabe ein.
Jeder Prozess kann gleichzeitig neun Dateideskriptoren geöffnet haben. Die Dateideskriptoren 0, 1, 2 werden für die Bash-Shell-Nutzung beibehalten.
0 STDIN.
1 STDOUT.
2 STDERR.
Sie können die obigen Dateideskriptoren verwenden, um die Ein- und Ausgabe zu steuern.
Sie müssen diese drei vollständig verstehen, da sie wie das Rückgrat Ihres Shell-Skriptings sind. Deshalb werden wir jeden von ihnen im Detail beschreiben.
STDIN
STDIN steht für Standard Input, was standardmäßig die Tastatur ist.
Sie können die STDIN, also die Tastatur, durch eine Datei ersetzen, indem Sie das Eingabeumleitungssymbol (<) verwenden, das die Daten als Tastatureingabe sendet. Keine Magie!!
Wenn Sie den cat-Befehl ohne etwas eingeben, akzeptiert er Eingaben von STDIN. Jede Zeile, die Sie eingeben, der cat-Befehl gibt diese Zeile auf dem Bildschirm aus.
STDOUT
STDOUT steht für die Standardausgabe, die standardmäßig der Bildschirm ist.
Mit dem>>-Symbol
können Sie die Ausgabe in eine Datei umleitenWenn wir eine Datei haben, die Daten enthält, können Sie Daten daran anhängen, indem Sie dieses Symbol verwenden:
pwd >> myfile
Die von pwd generierte Ausgabe wird an myfile angehängt, ohne den vorhandenen Inhalt zu löschen.
Der folgende Befehl versucht, die Ausgabe mithilfe des Symbols> symbol.
in eine Datei umzuleitenls –l xfile > myfile
Ich habe keine Datei namens xfile auf meinem PC, und das erzeugt einen Fehler, der an STDERR gesendet wird.
STDERR
Die Shell sendet standardmäßig Fehler an den Bildschirm.
Wenn Sie die Fehler in eine Protokolldatei umleiten müssen, anstatt sie an den Bildschirm zu senden, können Sie Fehler mit dem Umleitungssymbol umleiten.
Weiterleitungsfehler
Wir können die Fehler umleiten, indem wir den Dateideskriptor, der 2 ist, wie folgt vor das Umleitungssymbol setzen:
ls -l xfile 2>myfile
cat ./myfile
Wie Sie sehen können, befindet sich der Fehler jetzt in der Datei und nichts auf dem Bildschirm.
Umleitungsfehler und normale Ausgabe
Um Fehler und die normale Ausgabe umzuleiten, müssen Sie jedem den richtigen Dateideskriptor wie folgt voranstellen:
ls –l myfile xfile anotherfile 2> errorcontent 1> correctcontent
Das Ergebnis des ls-Befehls wird mithilfe von 1> an die Datei mit dem korrekten Inhalt gesendet Symbol. Und Fehlermeldungen wurden mit 2> an die errorcontent-Datei gesendet Symbol.
Mit &> können Sie die normale Ausgabe und Fehler in dieselbe Datei umleiten Symbol wie folgt:
ls –l myfile xfile anotherfile &> content
hier leiten wir die Fehler und die normale Ausgabe in eine Datei namens content.
um
Ausgabeumleitung
Es gibt zwei Möglichkeiten für die Ausgabeumleitung:
- Vorübergehende Weiterleitung.
- Permanente Weiterleitung.
Vorübergehende Weiterleitungen
Für temporäre Umleitungen können Sie das Symbol>&2 wie folgt verwenden:
#!/bin/bash echo "Error message" >&2 echo "Normal message"
Wenn wir es also ausführen, sehen wir, dass beide Zeilen normal gedruckt werden, da, wie wir wissen, Fehler standardmäßig auf dem Bildschirm angezeigt werden.
Sie können Fehler in eine Datei wie diese umleiten:
./myscript 2> myfile
Shell-Scripting ist genial! Die normale Ausgabe wird an den Bildschirm gesendet, während die Echonachricht mit dem Symbol>&2 Fehler an die Datei sendet.
Permanente Weiterleitungen
Wenn Sie viele Daten haben, die umgeleitet werden müssen, können Sie eine permanente Umleitung mit dem exec-Befehl wie folgt vornehmen:
#!/bin/bash exec 1>outfile echo "Permanent redirection" echo "from a shell to a file." echo "without redirecting every line"
Wenn wir uns die Datei mit dem Namen outfile ansehen, sehen wir die Ausgabe der Echozeilen.
Wir leiten die STDOUT am Anfang um, was ist in der Mitte eines Skripts wie diesem:
#!/bin/bash exec 2>myerror echo "Script Begining ..." echo "Redirecting Output" exec 1>myfile echo "Output goes to the myfile" echo "Output goes to myerror file" >&2
Der Befehl exec leitet alle Fehler in die Datei myerror um, und wir senden die Standardausgabe auf den Bildschirm.
Wir verwenden die Anweisung exec 1>myfile, um die Ausgabe in die Datei myfile umzuleiten, und schließlich gehen Fehler mit dem Symbol>&2.
in die Datei myerror
Eingabe umleiten
Sie können die Eingabe in eine Datei anstelle von STDIN umleiten, indem Sie den exec-Befehl wie folgt verwenden:
exec 0< myfile
Dieser Befehl weist die Shell an, die Eingabe aus einer Datei namens myfile anstelle von STDIN zu nehmen, und hier ist ein Beispiel:
#!/bin/bash exec 0<testfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done
Shell-Scripting ist einfach.
Sie wissen, wie Sie den Lesebefehl verwenden, um Benutzereingaben zu erhalten. Wenn Sie die STDIN in eine Datei umleiten, versucht der Lesebefehl, von der STDIN zu lesen, die auf die Datei verweist.
Einige Linux-Systemadministratoren verwenden diese Technik, um die Protokolldateien zur Verarbeitung zu lesen, und wir werden weitere Möglichkeiten zum professionellen Lesen des Protokolls in den kommenden Beiträgen diskutieren.
Benutzerdefinierte Weiterleitung erstellen
Sie wissen, dass es neun Dateideskriptoren gibt, Sie verwenden nur drei davon für Eingabe, Ausgabe und Fehler.
Die verbleibenden sechs Dateideskriptoren stehen für die Eingabe- und Ausgabeumleitung zur Verfügung.
Wir können den Befehl exec verwenden, um einen Dateideskriptor für die Ausgabe wie folgt zuzuweisen:
#!/bin/bash exec 3>myfile echo "This line appears on the screen" echo "This line stored on myfile" >&3 echo "This line appears on the screen"
Eingabedateideskriptoren erstellen
Gehen Sie wie folgt vor, um Eingabedateideskriptoren umzuleiten:
1- Speichern Sie die STDIN in einem anderen Dateideskriptor.
2- Umleitung in eine Datei.
3- Setzen Sie STDIN an seinen ursprünglichen Speicherort zurück.
Sehen Sie sich den folgenden Code an, um diese Schritte zu verstehen:
#!/bin/bash exec 7<&0 exec 0<myfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done exec 0<&7 read -p "Finished? " res case $res in y) echo "Goodbye" ;; n) echo "Sorry, this is the end." ;; esac
Wir haben die STDIN im Dateideskriptor 7 gespeichert und die STDIN in eine Datei umgeleitet.
Die STDIN wurde nach dem Iterieren über Dateizeilen an ihren ursprünglichen Speicherort zurückgesetzt.
Der letzte Lesebefehl, um sicherzustellen, dass STDIN zurückgesetzt wird und Sie die Tastatur normal verwenden können.
Dateideskriptoren schließen
Wenn das Skript beendet wird, werden die Dateideskriptoren automatisch geschlossen. Wenn Sie den Dateideskriptor selbst schließen möchten, leiten Sie den Dateideskriptor auf dieses Symbol &- um es wird geschlossen.
#!/bin/bash exec 3> myfile echo "Testing ..." >&3 exec 3>&- echo "Nothing works" >&3
Wie Sie sehen können, gibt es einen Fehler mit einem schlechten Dateideskriptor, weil er nicht mehr existiert.
lsof-Befehl
Der Befehl lsof wird verwendet, um alle geöffneten Dateien im System und in Hintergrundprozessen aufzulisten.
Auf vielen Linux-Systemen wie Fedora befindet sich der Befehl lsof unter /usr/sbin.
Dies sind einige der wichtigen Optionen für den lsof-Befehl:
-p:für Prozess-ID.
-d:für den Dateideskriptor.
Sie können die Prozess-PID mit der $$-Variablen abrufen.
Wir können das -a verwenden, um die Ergebnisse der Option -p und der Option -d zu kombinieren.
Testen Sie nun den Befehl aus einem Skript:
#!/bin/bash exec 4> myfile1 exec 5> myfile2 exec 6< myfile3 lsof -a -p $$ -d 0,1,2,4,5,6
Das Shell-Skript erstellt die Dateideskriptoren 4 und 5 zum Schreiben und 6 zum Lesen.
Befehlsausgabe unterdrücken
Manchmal möchten Sie keine Ausgabe sehen. Wir leiten die Ausgabe zum Schwarzen Loch um das ist /dev/null .
Beispielsweise können wir Fehler wie diesen unterdrücken:
ls -al badfile anotherfile 2> /dev/null
Mit demselben Befehl können Sie eine Datei kürzen, ohne sie vollständig zu löschen.
cat /dev/null > myfile
Jetzt verstehen Sie die Eingabe, die Ausgabe, wie Sie sie umleiten, wie Sie Ihren Dateideskriptor erstellen und darauf umleiten.
Ich hoffe du genießt es. Komm immer wieder.
Danke.