Webagentur » Digitale Nachrichten » So verwenden Sie "Here Documents" in Bash unter Linux

So verwenden Sie "Here Documents" in Bash unter Linux

Ein Terminalfenster auf einem Linux-Computersystem.
Fatmawati Achmad Zaenuri/Shutterstock

Die seltsam benannten "Dokumente hier" ermöglichen es Ihnen, die E / A-Umleitung in Bash-Skripten unter Linux zu verwenden. Es ist eine großartige Möglichkeit, die Befehle zu automatisieren, die Sie auf einem Remote-Computer ausführen müssen.

Hier Dokumente

Viele Befehle in Linux haben Namen aus zwei oder drei Buchstaben. Dies ist ein Teil der Idee, dass Linux schwer zu erlernen und voller mysteriöser Befehle ist. Aber einer der seltsamsten Namen in Linux ist keiner der kryptisch kurzen Namen. Die "Dokumente hier" sind keine Dokumente, und es ist auch nicht wirklich klar, worauf sich "hier" bezieht.

Sie sind ein relativ obskures Konstrukt, aber sie sind nützlich. Natürlich ist dies Linux, also gibt es mehr als eine Möglichkeit, eine Katze zu häuten. Einige der von den Materialien hier bereitgestellten Funktionen können auf andere Weise reproduziert werden. Diese alternativen Methoden sind im Allgemeinen komplizierter. In der Programmierung und Skripterstellung bedeutet "komplizierter" auch "fehleranfälliger" und Ihr Code ist schwieriger zu warten.

Die Dokumente zeichnen sich hier durch die Automatisierung der Befehle aus, die Sie über eine über ein Skript hergestellte Verbindung an einen Remote-Computer senden möchten. Die Verbindung ist einfach, aber wie "pumpen" Sie Ihre Befehle aus Ihrem Skript in die Shell des Remote-Computers, sobald die Verbindung hergestellt ist? Hier können Sie es mit den Dokumenten ganz einfach machen.

Grundlagen der Here-Dokumente

Die idiomatische Darstellung eines Dokuments sieht hier so aus:

BEFEHL << limit_string. . Textdatenvariablen. . limit_string
  • COMMANDER: Dies kann ein beliebiger Linux-Befehl sein, der umgeleitete Eingaben akzeptiert. Beachten Sie das echo Der Befehl akzeptiert keine umgeleiteten Eingaben. Wenn Sie auf dem Bildschirm schreiben müssen, können Sie die cat Befehl, wer tut.
  • <<: Der Umleitungsoperator.
  • limit_string: Dies ist ein Etikett. Es kann alles sein, was Sie wollen, solange es nicht in der Liste der Daten erscheint, die Sie an den Befehl umleiten. Es wird verwendet, um das Ende der Liste von Text, Daten und Variablen zu markieren.
  • Datenliste: Eine Liste der bei der Bestellung anzugebenden Daten. Es kann Befehle, Text und Variablen enthalten. Der Inhalt der Datenliste wird zeilenweise in die Befehlszeile eingegeben, bis der _limit_string gefunden wird.

Sie werden hier wahrscheinlich Beispiele für Dokumente sehen, die "EOF" als Grenzwertzeichenfolge verwenden. Wir befürworten diesen Ansatz nicht. Es funktioniert, aber „EOF“ bedeutet „Ende der Datei“. Abgesehen von dem seltenen Fall, in dem ein persönliches Dokument das letzte Element in einer Skriptdatei ist, wird "EOF" falsch verwendet.

Es macht Ihre Skripte viel lesbarer, wenn Sie eine Begrenzungszeichenfolge verwenden, die sich auf das bezieht, was Sie tun. Wenn Sie eine Reihe von Befehlen über Secure Shell (SSH) an einen Remote-Computer senden, wäre eine Begrenzungszeichenfolge namens "_remote_commands" durchaus sinnvoll. Sie müssen sie nicht mit einem Unterstrich beginnen." _ "Charakter. Wir tun dies, weil es sie als etwas Außergewöhnliches in Ihrem Skript markiert.

Einfache Beispiele

Hier können Sie Kommandozeilendokumente und in Skripten verwenden. Wenn Sie Folgendes in ein Terminalfenster eingeben, wird ein " >Aufforderung zur Fortsetzung der Zeile jedes Mal, wenn Sie "Enter" drücken. Wenn Sie die Begrenzungszeichenfolge "_end_of_text" eingeben und "Enter" drücken, wird die Liste der Websites übergeben cat, und sie werden im Terminalfenster angezeigt.

cat << _end_of_text Anleitung Geek Review Geek LifeSavvy CloudSavvy IT MindBounce _end_of_text

Dies ist nicht die interessanteste Übung, aber sie zeigt, dass nichts an den Befehl gesendet wird, bis die gesamte Datenliste erfasst und die Grenzwertzeichenfolge erfüllt ist. das cat Der Befehl erhält erst dann eine Eingabe, wenn Sie den Grenzwertstring "_end_of_text" eingeben und die Taste "Enter" drücken.

Dasselbe können Sie in einem Skript tun. Geben oder kopieren Sie dieses Beispiel in einen Editor, speichern Sie die Datei als "heredoc-1.sh" und schließen Sie den Editor.

#! / bin / bash cat << "_end_of_text" Ihr Benutzername ist: $ (whoami) Ihr aktuelles Arbeitsverzeichnis ist: $ PWD Ihre Bash-Version ist: $ BASH_VERSION _end_of_text

Wenn Sie diesem Artikel folgen, müssen Sie jedes Mal, wenn Sie ein Skript erstellen, es ausführbar machen, bevor es ausgeführt wird. Verwenden Sie in jedem Fall die chmod Auftrag. Ersetzen Sie in jedem Beispiel den Namen des Skripts durch den Namen des hier verwendeten Skripts.

chmod + x heredoc-1.sh

Dieses Skript enthält zwei Umgebungsvariablen, $PWD et $BASH_VERSION. Die Namen von Umgebungsvariablen werden bei der Ausführung des Skripts durch ihre Datenwerte (das aktuelle Arbeitsverzeichnis und die Version von Bash) ersetzt.

Das Skript verwendet auch Befehlsersetzung auf der whoami Auftrag. Der Name des Befehls wird durch seine eigene Ausgabe ersetzt. Die Ausgabe des gesamten Skripts wird mit dem Befehl cat in das Terminalfenster geschrieben. Wir führen das Skript aus, indem wir es mit dem Namen aufrufen:

./heredoc-1.sh

Wenn Sie das Skript bearbeiten und die Begrenzungszeichenfolge in der ersten Zeile des Dokuments hier in Anführungszeichen setzen » " “, Die Datenliste wird dem Befehl hier Dokument wörtlich übergeben. Anstelle von Variablenwerten werden Variablennamen angezeigt und es findet keine Befehlsersetzung statt.

#! / bin / bash cat << - "_end_of_text" Ihr Benutzername ist: $ (whoami) Ihr aktuelles Arbeitsverzeichnis ist: $ PWD Ihre Bash-Version ist: $ BASH_VERSION _end_of_text

Tabulatorzeichen verwalten

Standardmäßig werden Tabulatorzeichen aus Ihrer Datenliste beibehalten und in das Terminalfenster geschrieben. Kopieren und speichern Sie dieses Beispiel als "heredoc-2.sh". Machen Sie es ausführbar mit dem chmod bestellen. Bearbeiten Sie die eingerückten Zeilen, um sicherzustellen, dass sie am Anfang der Zeile ein oder zwei Tabulatorzeichen anstelle einer Reihe von Leerzeichen enthalten.

#! / bin / bash cat << _end_of_text Ihr Benutzername ist: $ (whoami) Ihr aktuelles Arbeitsverzeichnis ist: $ PWD Ihre Bash-Version ist: $ BASH_VERSION _end_of_text
./heredoc-2.sh

Tabs werden in das Terminalfenster geschrieben.

Durch Hinzufügen eines Bindestrichs " -Für den Umleitungsoperator ignoriert das Dokument hier die ersten Tabulatorzeichen. Speichern Sie dieses Beispiel als "heredoc-3.sh" und machen Sie es ausführbar.

#! / bin / bash cat << - _end_of_text Ihr Benutzername ist: $ (whoami) Ihr aktuelles Arbeitsverzeichnis ist: $ PWD Ihre Bash-Version ist: $ BASH_VERSION _end_of_text
./heredoc-3.sh

Tabs werden ignoriert. Es mag keine große Sache sein, ist aber aufgrund der eingerückten Abschnitte der Skripte eine interessante Möglichkeit, mit führenden Tabs umzugehen.

Schleifen und andere logische Konstrukte werden im Allgemeinen eingerückt. Wenn Ihr Dokument hier in einem eingerückten Abschnitt eines Skripts enthalten ist, verwenden Sie einen Bindestrich " -”Mit der Umleitung behebt der Operator Formatierungsprobleme, die durch führende Tabulatorzeichen verursacht werden.

#! / bin / bash if true; dann cat << - _limit_string Zeile 1 mit einem führenden Tabulator. Zeile 2 mit einem führenden Tab. Zeile 3 mit einem führenden Tab. _limit_string fi

Umleitung zu einer Datei

Die Ausgabe des mit dem Here-Dokument verwendeten Befehls kann in eine Datei umgeleitet werden. Verwenden Sie die " >"(Datei erstellen) oder">>"(Datei erstellen, falls nicht vorhanden, zur Datei hinzufügen, falls vorhanden) Umleitungsoperatoren Après die Begrenzungszeichenfolge in der ersten Zeile des Dokuments hier.

Dieses Skript ist "heredoc-4.sh". Es wird seine Ausgabe in eine Textdatei namens "session.txt" umleiten.

#! / bin / bash cat << _end_of_text> session.txt Ihr Benutzername ist: $ (whoami) Ihr aktuelles Arbeitsverzeichnis ist: $ PWD Ihre Bash-Version ist: $ BASH_VERSION _end_of_text
./heredoc-4.sh
Katzensitzung.text

Verrohrung vom Auslass zu einer anderen Steuerung

Die Ausgabe des in einem Here-Dokument verwendeten Befehls kann als Eingabe zu einem anderen Befehl umgeleitet werden. Verwenden Sie den Schlauch " |"Operator Après die Begrenzungszeichenfolge in der ersten Zeile des Dokuments hier. Wir leiten die Ausgabe des Befehls here document, cat, In sed. Wir wollen alle Vorkommen des Buchstabens "a" durch den Buchstaben "e" ersetzen.

Nennen Sie dieses Skript "heredoc-5.sh".

#! / bin / bash cat << _end_of_text | sed 's / a / e / g' How To Gaak _end_of_text
./heredoc-5.sh

"Gaak" wird zu "Geek" korrigiert.

Parameter an eine Funktion senden

Der mit einem Here-Dokument verwendete Befehl kann eine Funktion des Skripts sein.

Dieses Skript überträgt einige Fahrzeugdaten in einer Funktion. Die Funktion liest Daten, als ob sie von einem Benutzer eingegeben worden wären. Die Werte der Variablen werden dann gedruckt. Speichern Sie dieses Skript als "heredoc-6.sh".

#! / bin / bash # the set_car_details () function set_car_details () {read make read model read new_used read delivery_collect read location read price} # Das Here-Dokument, das die Daten an set_car_details übergibt () set_car_details << _mars_rover_data NASA Perseverance Rover Used Collect Mars (long, lat) 77.451865,18.445161 2.2 Milliarden _mars_rover_data # Abrufen der Fahrzeugdetails echo "Make: $ make" echo "Model: $ model" echo "New or Used: $ new_used" echo "Lieferung oder Abholung: $ delivery_collect" echo "Standort: $ Standort" echo "Preis $: $ Preis"
./heredoc-6.sh

Fahrzeugdetails werden in das Terminalfenster geschrieben.

E-Mail erstellen und senden

Wir können hier ein Dokument verwenden, um eine E-Mail zu verfassen und zu senden. Beachten Sie, dass wir Parameter vor dem Umleitungsoperator an den Befehl übergeben können. Wir verwenden Linux mail Befehl zum Senden einer E-Mail über das lokale Mailsystem an das Benutzerkonto namens "dave". das -s Die Option (Betreff) ermöglicht es uns, den Betreff der E-Mail anzugeben.

Dieses Beispiel bildet das Skript "heredoc-7.sh".

#! / bin / bash article = "Hier Dokumente" mail -s 'Workload-Status' dave << _project_report Benutzername: $ (whoami) Hat die Aufgabe abgeschlossen: Artikel: $ article _project_report
./heredoc-7.sh

Es gibt keine sichtbare Ausgabe von diesem Skript. Aber wenn wir unsere E-Mails überprüfen, stellen wir fest, dass die E-Mail erstellt, gesendet und zugestellt wurde.

E-mail

Here-Dokumente mit SSH . verwenden

Dokumente sind hier eine leistungsstarke und komfortable Möglichkeit, bestimmte Befehle auf einem entfernten Computer auszuführen, nachdem eine SSH-Verbindung hergestellt wurde. Wenn Sie SSH-Schlüssel zwischen den beiden Computern konfiguriert haben, erfolgt der Verbindungsvorgang vollautomatisch. In diesem Quick-and-dirty-Beispiel werden Sie nach dem Kennwort für das Benutzerkonto auf dem Remote-Computer gefragt.

Dieses Skript ist "heredoc-8.sh". Wir werden eine Verbindung zu einem Remote-Computer namens "Remote-PC" herstellen. Das Benutzerkonto heißt "dave". Wir nehmen das -T (Pseudo-Terminal-Zuordnung deaktivieren), da wir kein interaktives Pseudo-Terminal benötigen, das uns zugewiesen wird.

Im Abschnitt "Hier arbeiten" des Skripts könnten wir eine Liste von Befehlen übergeben, die auf dem Remote-Computer ausgeführt werden. Natürlich können Sie einfach ein Skript aufrufen, das sich auf dem Remote-Computer befindet. Das Remote-Skript kann alle Befehle und Routinen enthalten, die Sie ausführen möchten.

Unser Skript - heredoc-8.sh - wird lediglich ein Verbindungsprotokoll auf dem Remote-Computer aktualisieren. Das Benutzerkonto und ein Zeitstempel werden in einer Textdatei gespeichert.

#! / bin / bash ssh -T dave@remote-pc.local << _remote_commands # hier ein bisschen arbeiten # Verbindungsprotokoll aktualisieren echo $ USER "-" $ (Datum) >> / home / dave / conn_log / script. log _remote_commands

Wenn wir den Befehl ausführen, werden wir aufgefordert, das Kontopasswort auf der Seite einzugeben Fernbedienung l'ordinateur.

./heredoc-8.sh

Einige Informationen über den Remote-Computer werden angezeigt und wir kehren zur Eingabeaufforderung zurück.

Auf dem Fernbedienung Computer, den wir benutzen können cat um das Verbindungsprotokoll zu überprüfen:

Katze conn_log / script.log

Jede Verbindung ist für uns aufgelistet.

Seltsamer Name, coole Features

Die Dokumente hier sind originell, aber leistungsstark, insbesondere wenn sie zum Senden von Befehlen an einen Remote-Computer verwendet werden. Es wäre einfach, ein Backup-Routine-Skript zu erstellen mit rsync. Das Skript kann dann eine Verbindung zum Remote-Computer herstellen, den verbleibenden Speicherplatz überprüfen und eine Warn-E-Mail senden, wenn der Speicherplatz nicht ausreicht.

★ ★ ★ ★ ★