So verwenden Sie „Hier-Dokumente“ in Bash unter Linux

Veröffentlicht: 2022-01-29
Ein Terminalfenster auf einem Linux-Computersystem.
Fatmawati Achmad Zaenuri/Shutterstock

Mit den seltsam benannten „Here-Dokumenten“ können Sie die Eingabe-/Ausgabeumleitung innerhalb von Bash-Skripten unter Linux verwenden. Sie sind eine großartige Möglichkeit, Befehle zu automatisieren, die Sie auf einem Remote-Computer ausführen müssen.

Hier Dokumente

Viele Befehle in Linux haben Namen mit zwei oder drei Buchstaben. Dies ist teilweise der Grund für die Vorstellung, dass Linux schwer zu erlernen und voller geheimnisvoller Befehle ist. Aber einer der seltsamsten Namen in Linux ist keiner der kryptisch kurzen. „Hier-Dokumente“ 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, einer Katze das Fell abzuziehen. Einige der von diesen Dokumenten bereitgestellten Funktionen können auf andere Weise reproduziert werden. Diese alternativen Methoden sind normalerweise komplizierter. Beim Programmieren und Scripting bedeutet „komplizierter“ auch „anfälliger für Fehler“ und dass Ihr Code schwieriger zu warten ist.

Wo sich Dokumente hier wirklich auszeichnen, ist die Automatisierung von Befehlen, die Sie von einer Verbindung aus, die innerhalb eines Skripts hergestellt wurde, an einen entfernten Computer senden möchten. Das Herstellen der Verbindung ist einfach, aber wie „pumpen“ Sie nach dem Herstellen der Verbindung Ihre Befehle aus Ihrem Skript in die Shell auf dem Remote-Computer? Hier Dokumente können Sie das ganz einfach tun.

Grundprinzipien von Here-Dokumenten

Die idiomatische Darstellung eines Here-Dokuments sieht so aus:

 BEFEHL << limit_string
 .
 .
Text 
Daten
Variablen
.
.
limit_string
  • COMMAND : Dies kann ein beliebiger Linux-Befehl sein, der umgeleitete Eingaben akzeptiert. Beachten Sie, dass der echo -Befehl keine umgeleiteten Eingaben akzeptiert. Wenn Sie auf den Bildschirm schreiben müssen, können Sie den cat -Befehl verwenden, der dies tut.
  • << : Der Umleitungsoperator.
  • limit_string : Dies ist ein Label. Es kann alles sein, was Sie möchten, solange es nicht in der Liste der Daten erscheint, die Sie in den Befehl umleiten. Es wird verwendet, um das Ende der Text-, Daten- und Variablenliste zu markieren.
  • Datenliste : Eine Liste von Daten, die dem Befehl zugeführt werden sollen. Es kann Befehle, Text und Variablen enthalten. Der Inhalt der Datenliste wird zeilenweise in den Befehl eingegeben, bis der _limit_string angetroffen wird.
Anzeige

Sie werden wahrscheinlich Beispiele für diese Dokumente sehen, die „EOF“ als Begrenzungszeichenfolge verwenden. Wir befürworten diesen Ansatz nicht. Es funktioniert, aber „EOF“ bedeutet „End of File“. Abgesehen von dem seltenen Fall, dass ein Home-Dokument das Letzte in einer Skriptdatei ist, wird „EOF“ fälschlicherweise verwendet.

Es wird Ihre Skripte viel besser lesbar machen, 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“ absolut sinnvoll. Sie müssen sie nicht mit einem Unterstrich „ _ “ beginnen. Wir tun das, weil es sie in Ihrem Drehbuch als etwas Außergewöhnliches markiert.

Einfache Beispiele

Sie können hier Dokumente auf der Kommandozeile und in Skripten verwenden. Wenn Sie Folgendes in ein Terminalfenster eingeben, sehen Sie jedes Mal, wenn Sie „Enter“ drücken, eine Aufforderung zur Zeilenfortsetzung „ > “. Wenn Sie die Begrenzungszeichenfolge „_end_of_text“ eingeben und „Enter“ drücken, wird die Liste der Websites an cat, übergeben und im Terminalfenster angezeigt.

 Katze << _Ende_des_Textes 
Anleitung Geek 
Rezension Geek 
Lebenserfahren 
CloudSavvy IT
MindBounce
_ende_des_textes 

Das ist nicht die lohnenswerteste Übung, aber es zeigt, dass nichts an den Befehl gesendet wird, bis die gesamte Datenliste zusammengestellt ist und die Begrenzungszeichenfolge auftritt. Der cat -Befehl erhält keine Eingabe, bis Sie die Begrenzungszeichenfolge „_end_of_text“ eingeben und die „Enter“-Taste drücken.

Wir können dasselbe 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

Katze << "_end_of_text"
Ihr Benutzername ist: $(whoami)
Ihr aktuelles Arbeitsverzeichnis ist: $PWD
Ihre Bash-Version ist: $BASH_VERSION
_ende_des_textes

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 den Befehl chmod . Ersetzen Sie den Namen des Skripts in jedem Beispiel durch den hier verwendeten Skriptnamen.

 chmod +x heredoc-1.sh 

Anzeige

Dieses Skript enthält zwei Umgebungsvariablen, $PWD und $BASH_VERSION . Die Namen der Umgebungsvariablen werden durch ihre Datenwerte – das aktuelle Arbeitsverzeichnis und die Bash-Version – ersetzt, wenn das Skript ausgeführt wird.

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

 ./heredoc-1.sh 

Wenn Sie das Skript ändern und die Begrenzungszeichenfolge in der ersten Zeile des Here-Dokuments in Anführungszeichen ” " “ setzen, wird die Datenliste wörtlich an den Here-Dokumentbefehl übergeben. Variablennamen werden anstelle von Variablenwerten angezeigt, und die Befehlsersetzung wird angezeigt nicht stattfinden.

 #!/bin/bash

Katze <<- "_end_of_text"
Ihr Benutzername ist: $(whoami)
Ihr aktuelles Arbeitsverzeichnis ist: $PWD
Ihre Bash-Version ist: $BASH_VERSION
_ende_des_textes
 ./heredoc-1.sh 

Umgang mit Tabulatorzeichen

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

 #!/bin/bash

Katze << _Ende_des_Textes
Ihr Benutzername ist: $(whoami)
  Ihr aktuelles Arbeitsverzeichnis ist: $PWD
    Ihre Bash-Version ist: $BASH_VERSION
_ende_des_textes
 ./heredoc-2.sh 

Die Registerkarten werden in das Terminalfenster geschrieben.

Durch Hinzufügen eines Bindestrichs „ - “ zum Umleitungsoperator ignoriert das Here-Dokument führende Tabulatorzeichen. Speichern Sie dieses Beispiel als „heredoc-3.sh“ und machen Sie es ausführbar.

 #!/bin/bash

Katze <<- _end_of_text
Ihr Benutzername ist: $(whoami)
  Ihr aktuelles Arbeitsverzeichnis ist: $PWD
    Ihre Bash-Version ist: $BASH_VERSION
_ende_des_textes
 ./heredoc-3.sh 

Die Tabulatoren werden ignoriert. Das mag trivial erscheinen, aber es ist eine nette Möglichkeit, mit führenden Tabulatoren aufgrund eingerückter Abschnitte von Skripten fertig zu werden.

Anzeige

Schleifen und andere logische Konstrukte sind normalerweise eingerückt. Wenn Ihr Here-Dokument in einem eingerückten Abschnitt eines Skripts enthalten ist, entfernt die Verwendung eines Bindestrichs „ - “ mit dem Umleitungsoperator Formatierungsprobleme, die durch die führenden Tabulatorzeichen verursacht werden.

 #!/bin/bash

Wenn wahr; dann
  Katze <<- _limit_string
  Zeile 1 mit führendem Tabulator.
  Zeile 2 mit führendem Tabulator.
  Zeile 3 mit führendem Tabulator.
  _limit_string
fi

Umleitung auf eine Datei

Die Ausgabe des mit dem Here-Dokument verwendeten Befehls kann in eine Datei umgeleitet werden. Verwenden Sie die Umleitungsoperatoren „ > “ (Datei erstellen) oder „ >> “ (Datei erstellen, falls nicht vorhanden, an Datei anhängen, falls vorhanden) nach der Begrenzungszeichenfolge in der ersten Zeile des Here-Dokuments.

Dieses Skript ist „heredoc-4.sh“. Es leitet seine Ausgabe in eine Textdatei namens „session.txt“ um.

 #!/bin/bash

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

Weiterleiten der Ausgabe an einen anderen Befehl

Die Ausgabe des in einem Here-Dokument verwendeten Befehls kann als Eingabe an einen anderen Befehl weitergeleitet werden. Verwenden Sie die Pipe „ | ”-Operator nach der Begrenzungszeichenfolge in der ersten Zeile des Here-Dokuments. Wir werden die Ausgabe des Here-Dokument-Befehls, cat , in sed . Wir wollen alle Vorkommen des Buchstabens „a“ durch den Buchstaben „e“ ersetzen.

Benennen Sie dieses Skript „heredoc-5.sh“.

 #!/bin/bash

Katze << _Ende_des_Textes | sed 's/a/e/g'
Wie
Zu
Gaak
_ende_des_textes
 ./heredoc-5.sh

„Gaak“ wird zu „Geek“ korrigiert.

Senden von Parametern an eine Funktion

Der Befehl, der mit einem Here-Dokument verwendet wird, kann eine Funktion im Skript sein.

Dieses Skript übergibt einige Fahrzeugdaten an eine Funktion. Die Funktion liest die Daten so, als ob sie von einem Benutzer eingegeben worden wären. Anschließend werden die Werte der Variablen ausgedruckt. Speichern Sie dieses Skript als „heredoc-6.sh“.

 #!/bin/bash

# die Funktion set_car_details()
set_car_details ()
{
lesen machen
Modell lesen
lesen Sie neu_gebraucht
Lies delivery_collect
Standort lesen
Preis lesen
}

# Das Here-Dokument, das die Daten an set_car_details() übergibt
set_car_details << _mars_rover_data
NASA
Ausdauer Rover
Gebraucht
Sammeln
Mars (lang, lat) 77.451865,18.445161
2,2 Milliarden
_mars_rover_data

# Rufen Sie die Fahrzeugdetails ab
echo "Make: $make"
echo "Modell: $model"
echo "Neu oder gebraucht: $new_used"
echo "Lieferung oder Abholung: $delivery_collect"
echo "Ort: $location"
echo "Preis \$: $Preis"
 ./heredoc-6.sh 

Die Fahrzeugdetails werden in das Terminalfenster geschrieben.

Erstellen und Senden einer E-Mail

Wir können ein hier vorliegendes Dokument verwenden, um eine E-Mail zu verfassen und zu senden. Beachten Sie, dass wir Parameter an den Befehl vor dem Umleitungsoperator übergeben können. Wir verwenden den mail Befehl von Linux, um eine E-Mail über das lokale Mail-System an das Benutzerkonto „dave“ zu senden. Die Option -s (Betreff) ermöglicht es uns, den Betreff für die E-Mail anzugeben.

Dieses Beispiel bildet das Skript „heredoc-7.sh“.

 #!/bin/bash

article="Hier Dokumente"

mail -s 'Arbeitslaststatus' dave << _project_report
Benutzername: $(whoami)
Hat den Auftrag abgeschlossen:
Artikel: $artikel
_Projektbericht
 ./heredoc-7.sh 

Anzeige

Es gibt keine sichtbare Ausgabe dieses Skripts. Aber wenn wir unsere E-Mails überprüfen, sehen wir, dass die E-Mail verfasst, versendet und zugestellt wurde.

 Post 

Verwenden von Here-Dokumenten mit SSH

Hier sind Dokumente eine leistungsstarke und bequeme Möglichkeit, einige Befehle auf einem entfernten Computer auszuführen, sobald eine SSH-Verbindung hergestellt wurde. Wenn Sie SSH-Schlüssel zwischen den beiden Computern eingerichtet haben, erfolgt der Anmeldevorgang vollautomatisch. In diesem Quick-and-Dirty-Beispiel werden Sie zur Eingabe des Passworts für das Benutzerkonto auf dem Remote-Computer aufgefordert.

Dieses Skript ist „heredoc-8.sh“. Wir werden uns mit einem entfernten Computer namens „Remote-PC“ verbinden. Das Benutzerkonto heißt „dave“. Wir verwenden die Option -T (Pseudo-Terminal-Zuweisung deaktivieren), da uns kein interaktives Pseudo-Terminal zugewiesen werden muss.

Im Abschnitt „do some work in here“ des Skripts könnten wir eine Liste von Befehlen übergeben, und diese würden auf dem Remote-Computer ausgeführt. Natürlich könnten Sie auch einfach ein Skript aufrufen, das sich auf dem Remote-Computer befindet. Das entfernte Skript könnte alle Befehle und Routinen enthalten, die Sie ausgeführt haben möchten.

Unser Skript – heredoc-8.sh – wird lediglich ein Verbindungsprotokoll auf dem Remote-Computer aktualisieren. Das Benutzerkonto sowie ein Zeit- und Datumsstempel werden in einer Textdatei protokolliert.

 #!/bin/bash

ssh -T [email protected] << _remote_commands

# Arbeite hier drin

# Verbindungsprotokoll aktualisieren
echo $USER "-" $(date) >> /home/dave/conn_log/script.log
_remote_commands
Anzeige

Wenn wir den Befehl ausführen, werden wir zur Eingabe des Kennworts für das Konto auf dem Remotecomputer aufgefordert.

 ./heredoc-8.sh 

Einige Informationen über den Remotecomputer werden angezeigt, und wir kehren zur Eingabeaufforderung zurück.

Auf dem Remote- Computer können wir cat verwenden, um das Verbindungsprotokoll zu überprüfen:

 cat conn_log/script.log 

Jede Verbindung wird für uns aufgelistet.

VERWANDT: So erstellen und installieren Sie SSH-Schlüssel aus der Linux-Shell

Seltsamer Name, nette Funktionen

Hier sind Dokumente eigenartig, aber leistungsfähig, insbesondere wenn sie zum Senden von Befehlen an einen entfernten Computer verwendet werden. Es wäre eine einfache Sache, eine Backup-Routine mit rsync zu skripten. Das Skript könnte sich dann mit dem Remote-Computer verbinden, den verbleibenden Speicherplatz überprüfen und eine Warn-E-Mail senden, wenn der Speicherplatz knapp wird.

VERWANDT: So sichern Sie Ihr Linux-System mit rsync