
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 diecat
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.
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“.
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.
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