So verwenden Sie „Here Documents“ in Bash unter Linux on

Ein Terminalfenster auf einem Linux-Computersystem.

Mit den seltsam benannten „Hier-Dokumenten“ können Sie die Eingabe-/Ausgabe-Umleitung in 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 nicht einer 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, eine Katze zu häuten. Einige der von diesen Dokumenten bereitgestellten Funktionen können auf andere Weise reproduziert werden. Diese alternativen Methoden sind normalerweise komplizierter. In der Programmierung und Skripterstellung bedeutet „komplizierter“ auch „anfälliger für Fehler“ und dass Ihr Code schwieriger zu warten ist.

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

Grundprinzipien von Here-Dokumenten

Die idiomatische Darstellung eines Here-Dokuments sieht so aus:

COMMAND << limit_string
 .
 .
text 
data
variables
.
.
limit_string
  • BEFEHL: Dies kann ein beliebiger Linux-Befehl sein, der umgeleitete Eingaben akzeptiert. Beachten Sie das echo Befehl akzeptiert keine umgeleiteten Eingaben. Wenn Sie auf den Bildschirm schreiben müssen, können Sie die cat Befehl, was macht.
  • <<: Der Umleitungsoperator.
  • limit_string: Dies ist ein Etikett. Es kann beliebig sein, 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 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, dass ein Home-Dokument das letzte in einer Skriptdatei ist, wird „EOF“ fälschlicherweise 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 a an einen Remote-Computer senden Sichere Hülle (SSH) wäre eine Begrenzungszeichenfolge mit dem Namen „_remote_commands“ durchaus sinnvoll. Sie müssen sie nicht mit einem Unterstrich beginnen “_“ Charakter. Wir tun das, weil es sie in Ihrem Skript 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 ein „>” Zeilenfortsetzungsaufforderung jedes Mal, wenn Sie „Enter“ drücken. Wenn Sie die Begrenzungszeichenfolge „_end_of_text“ eingeben und „Enter“ drücken, wird die Liste der Websites an passed weitergegeben cat, und sie werden im Terminalfenster angezeigt.

cat << _end_of_text 
How-To Geek 
Review Geek 
LifeSavvy 
CloudSavvy IT
MindBounce
_end_of_text

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

Verwandt :  So verwenden Sie Google Optimize für Landingpages

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

cat << "_end_of_text"
Your user name is: $(whoami)
Your current working directory is: $PWD
Your Bash version is: $BASH_VERSION
_end_of_text

Wenn Sie diesem Artikel folgen, müssen Sie jedes Mal, wenn Sie ein Skript erstellen, ausführbar machen bevor es läuft. Verwenden Sie in jedem Fall die chmod Befehl. Ersetzen Sie den Namen des Skripts in jedem Beispiel für den hier verwendeten Skriptnamen.

chmod +x heredoc-1.sh

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

Das Skript verwendet auch Befehlsersetzung auf der whoami Befehl. 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 ändern und den Grenzwertstring in der ersten Zeile des Here-Dokuments in Anführungszeichen setzen ” " “, wird die Datenliste wörtlich an den Befehl here document übergeben. Anstelle von Variablenwerten werden Variablennamen angezeigt, und die Befehlsersetzung findet nicht statt.

#!/bin/bash

cat <<- "_end_of_text"
Your user name is: $(whoami)
Your current working directory is: $PWD
Your Bash version is: $BASH_VERSION
_end_of_text
./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 ausführbar mit dem chmod Befehl. 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
Your user name is: $(whoami)
  Your current working directory is: $PWD
    Your Bash version is: $BASH_VERSION
_end_of_text
./heredoc-2.sh

Die Registerkarten werden in das Terminalfenster geschrieben.

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

#!/bin/bash

cat <<- _end_of_text
Your user name is: $(whoami)
  Your current working directory is: $PWD
    Your Bash version is: $BASH_VERSION
_end_of_text
./heredoc-3.sh

Die Registerkarten werden ignoriert. Dies mag trivial erscheinen, ist aber eine gute Möglichkeit, mit führenden Tabulatoren aufgrund eingerückter Abschnitte von Skripten umzugehen.

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

#!/bin/bash

if true; then
  cat <<- _limit_string
  Line 1 with a leading tab.
  Line 2 with a leading tab.
  Line 3 with a leading 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, an Datei anhängen, falls vorhanden) Umleitungsoperatoren nach dem die 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
Your user name is: $(whoami)
Your current working directory is: $PWD
Your Bash version is: $BASH_VERSION
_end_of_text
./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. Benutze die Pfeife“|“ Operator nach dem die Begrenzungszeichenfolge in der ersten Zeile des Here-Dokuments. Wir leiten die Ausgabe des Befehls here document weiter, cat, in sed. Wir wollen alle Vorkommen ersetzen occurrence des Buchstabens „a“ mit dem Buchstaben „e“.

Verwandt :  So finden Sie Songtexte auf Spotify (Desktop, Handy, TV)

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 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, 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
}

# The here document that passes the data to set_car_details()
set_car_details << _mars_rover_data
NASA
Perseverance Rover
Used
Collect
Mars (long,lat) 77.451865,18.445161
2.2 billion
_mars_rover_data

# Retrieve the vehicle details
echo "Make: $make"
echo "Model: $model"
echo "New or Used: $new_used"
echo "Delivery or Collection: $delivery_collect"
echo "Location: $location"
echo "Price $: $price"
./heredoc-6.sh

Die Fahrzeugdetails werden in das Terminalfenster geschrieben.

Erstellen und Senden einer E-Mail

Wir können ein Here-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. Wurden mit dem Linux mail Befehl zu eine E-Mail über das lokale Mailsystem senden zum Benutzerkonto namens „dave“. Das -s Die Option (Betreff) ermöglicht es uns, den Betreff für die E-Mail anzugeben.

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

#!/bin/bash

article="Here Documents"

mail -s 'Workload status' dave << _project_report
User name: $(whoami)
Has completed assignment:
Article: $article
_project_report
./heredoc-7.sh

Es gibt keine sichtbare Ausgabe von diesem Skript. Aber wenn wir unsere E-Mails überprüfen, sehen wir, dass die E-Mail verfasst, versandt und zugestellt wurde.

mail

Verwenden von Here-Dokumenten mit SSH

Hier stellen Dokumente eine leistungsstarke und bequeme Möglichkeit dar, 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 schnellen und schmutzigen 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 verwenden die -T (Pseudo-Terminal-Zuweisung deaktivieren), da wir kein interaktives Pseudo-Terminal benötigen, das uns zugewiesen wird.

Im Abschnitt „mache hier etwas Arbeit“ des Skripts könnten wir eine Liste von Befehlen übergeben, und diese würden auf dem Remote-Computer ausgeführt. Natürlich können Sie auch einfach ein Skript aufrufen, das sich auf dem Remote-Computer befindet. Das Remote-Skript könnte 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 sowie ein Zeit- und Datumsstempel werden in einer Textdatei protokolliert.

#!/bin/bash

ssh -T [email protected] << _remote_commands

# do some work in here

# update connection log
echo $USER "-" $(date) >> /home/dave/conn_log/script.log
_remote_commands

Wenn wir den Befehl ausführen, werden wir zur Eingabe des Passworts für das Konto auf dem Fernbedienung Computer.

./heredoc-8.sh

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

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

cat conn_log/script.log

Jede Verbindung ist für uns aufgelistet.

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

Seltsamer Name, nette Funktionen

Hier sind Dokumente skurril, aber leistungsstark, insbesondere wenn sie zum Senden von Befehlen an einen Remote-Computer verwendet werden. Es wäre einfach, eine Backup-Routine mit . zu skripten rsync. Das Skript könnte dann eine Verbindung zum Remote-Computer herstellen, den verbleibenden Speicherplatz überprüfen und eine Warn-E-Mail senden, wenn der Speicherplatz knapp wird.

VERBUNDEN: So sichern Sie Ihr Linux-System

Moyens Staff
Moyens I/O-Personal. motivierte Sie und gab Ratschläge zu Technologie, persönlicher Entwicklung, Lebensstil und Strategien, die Ihnen helfen werden.