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

Shell-Scripting Teil 4 – Eingabe, Ausgabe und Umleitung

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 umleiten

Wenn 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 umzuleiten
ls –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.


Linux
  1. Lesen und schreiben Sie Daten von überall mit Umleitung im Linux-Terminal

  2. So leiten Sie die Ausgabe in eine Datei und Stdout in Linux um

  3. Dateideskriptoren und Shell-Scripting?

  4. Ausgabe umleiten und leiten?

  5. Io-Umleitung und der Head-Befehl?

So leiten Sie die Shell-Befehlsausgabe um

Eingabe-Ausgabe-Umleitung unter Linux erklärt

Erklärt:Eingabe-, Ausgabe- und Fehlerumleitung in Linux

Bash-Skripting:So geben Sie Text in der Linux-Shell aus und formatieren ihn

Verwendung von rz und sz unter Linux-Shell

Linux:Wie verwende ich eine Datei gleichzeitig als Ein- und Ausgabe?