![Een terminalvenster op een Linux-computersysteem.](https://www.howtogeek.com/wp-content/uploads/2019/09/stock-lede-linux-see-attribution.png?width=1200&trim=1,1&bg-color=000&pad=1,1)
Met de vreemd genaamde “here documents” kun je input / out-omleiding gebruiken in Bash-scripts op Linux. Ze zijn een geweldige manier om opdrachten te automatiseren die u op een externe computer moet uitvoeren.
Hier Documenten
Veel commando’s in Linux hebben namen van twee of drie letters. Dit is gedeeltelijk wat aanleiding geeft tot het idee dat Linux moeilijk te leren is en vol geheimzinnige commando’s. Maar een van de raarste namen in Linux is niet een van de cryptisch korte. “Hier documenten” zijn geen documenten, en het is ook niet echt duidelijk waar het “hier” naar verwijst.
Ze zijn een relatief obscuur construct, maar ze zijn nuttig. Dit is natuurlijk Linux, dus er is meer dan één manier om een kat te villen. Een deel van de functionaliteit die door deze documenten wordt geboden, kan op andere manieren worden gereproduceerd. Die alternatieve methoden zijn meestal ingewikkelder. Bij het programmeren en scripten betekent “ingewikkelder” ook “vatbaarder voor bugs” en dat uw code moeilijker te onderhouden is.
Waar documenten hier echt uitblinken, is de automatisering van opdrachten die u naar een externe computer wilt sturen vanaf een verbinding die tot stand is gebracht vanuit een script. Het maken van de verbinding is eenvoudig, maar als de verbinding tot stand is gebracht, hoe “pompt” u uw commando’s dan van uw script naar de shell op de externe computer? Hier laten documenten u dat heel eenvoudig doen.
Basisprincipes van hier documenten
De idiomatische weergave van een here-document ziet er als volgt uit:
COMMAND << limit_string . . text data variables . . limit_string
-
OPDRACHT: Dit kan elke Linux-opdracht zijn die omgeleide invoer accepteert. Merk op
echo
commando accepteert geen omgeleide invoer. Als u naar het scherm moet schrijven, kunt u decat
commando, wat doet. - : De omleidingsoperator.
- limit_string: Dit is een label. Het kan zijn wat u maar wilt, zolang het maar niet voorkomt in de lijst met gegevens die u naar de opdracht omleidt. Het wordt gebruikt om het einde van de lijst met tekst, gegevens en variabelen te markeren.
- Datalijst: Een lijst met gegevens die naar de opdracht moeten worden gestuurd. Het kan opdrachten, tekst en variabelen bevatten. De inhoud van de datalijst wordt regel voor regel in de opdracht ingevoerd totdat de _limit_string wordt aangetroffen.
U zult waarschijnlijk voorbeelden zien van documenten die “EOF” als limietreeks gebruiken. Wij zijn geen voorstander van die benadering. Het werkt, maar ‘EOF’ betekent ‘Einde van bestand’. Afgezien van het zeldzame geval dat een homedocument het laatste is in een scriptbestand, wordt “EOF” ten onrechte gebruikt.
Het maakt uw scripts veel leesbaarder als u een limietstring gebruikt die verwijst naar wat u doet. Als je een reeks commando’s naar een externe computer stuurt via Secure Shell (SSH), zou een limietstring met de naam “_remote_commands” volkomen logisch zijn. U hoeft ze niet te beginnen met een onderstrepingsteken “_
”Karakter. We doen dat omdat het ze markeert als iets buitengewoons in uw script.
Simpele voorbeelden
U kunt hier documenten op de opdrachtregel en in scripts gebruiken. Wanneer u het volgende in een terminalvenster typt, ziet u een “>
“Regel vervolgingsprompt telkens wanneer u op” Enter “drukt. Wanneer u de “_end_of_text” limietreeks typt en op “Enter” drukt, wordt de lijst met websites doorgegeven aan cat,
en ze worden weergegeven in het terminalvenster.
cat << _end_of_text How-To Geek Review Geek LifeSavvy CloudSavvy IT MindBounce _end_of_text
Dat is niet de meest waardevolle oefening, maar het laat wel zien dat er niets naar de opdracht wordt gestuurd totdat de volledige lijst met gegevens is verzameld en de limietreeks is aangetroffen. De cat
commando ontvangt geen invoer totdat u de limit string “_end_of_text” invoert en op de “Enter” -toets drukt.
We kunnen hetzelfde doen in een script. Typ of kopieer dit voorbeeld naar een editor, sla het bestand op als “heredoc-1.sh” en sluit de 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
Zoals u dit artikel volgt, moet u elke keer dat u een script maakt, het uitvoerbaar maken voordat het wordt uitgevoerd. Gebruik in elk geval de chmod
opdracht. Vervang de naam van het script in elk voorbeeld door de scriptnaam die hier wordt gebruikt.
chmod +x heredoc-1.sh
Dit script bevat twee omgevingsvariabelen, $PWD
en $BASH_VERSION
De namen van omgevingsvariabelen worden vervangen door hun datawaarden – de huidige werkdirectory en de versie van Bash – wanneer het script wordt uitgevoerd.
Het script gebruikt ook commando vervanging op de whoami
opdracht. De naam van de opdracht wordt vervangen door zijn eigen uitvoer. De uitvoer van het volledige script wordt met het cat-commando naar het terminalvenster geschreven. We voeren het script uit door het bij naam te noemen:
./heredoc-1.sh
Als u het script wijzigt en de limietstring in de eerste regel van het document hier tussen aanhalingstekens plaatst ‘ "
“, Wordt de datalijst letterlijk doorgegeven aan het hier documentcommando. Variabelenamen worden weergegeven in plaats van variabelewaarden, en opdrachtvervanging vindt niet plaats.
#!/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
Omgaan met tabtekens
Standaard worden tabtekens in uw datalijst bewaard en naar het terminalvenster geschreven. Kopieer dit voorbeeld en sla het op als ‘heredoc-2.sh’. Maak het uitvoerbaar met de chmod
opdracht. Bewerk de ingesprongen regels om ervoor te zorgen dat ze een of twee tabtekens aan het begin van de regel hebben in plaats van een reeks spaties.
#!/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
De tabbladen worden naar het terminalvenster geschreven.
Door een streepje ‘-
”Aan de omleidingsoperator, negeert het document hier de voorlooptabtekens. Bewaar dit voorbeeld als “heredoc-3.sh” en maak het uitvoerbaar.
#!/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
De tabbladen worden genegeerd. Dit lijkt misschien triviaal, maar het is een handige manier om met voorlopende tabbladen om te gaan vanwege ingesprongen secties van scripts.
Lussen en andere logische constructies zijn meestal ingesprongen. Als uw document hier is opgenomen in een ingesprongen gedeelte van een script, gebruikt u een streepje ‘-
”Met de omleidingsoperator verwijdert opmaakproblemen die worden veroorzaakt door de voorlooptabtekens.
#!/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
Omleiden naar een bestand
De uitvoer van de opdracht die wordt gebruikt met het document hier kan worden omgeleid naar een bestand. Gebruik de “>
“(Maak het bestand) of”>>
”(Maak het bestand aan als het niet bestaat, voeg het toe aan het bestand als dit het geval is) redirection operators na de limit string in de eerste regel van het here document.
Dit script is ‘heredoc-4.sh’. De uitvoer wordt omgeleid naar een tekstbestand met de naam ‘session.txt’.
#!/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
De uitvoer naar een ander commando leiden
De uitvoer van de opdracht die in een here-document wordt gebruikt, kan als invoer naar een andere opdracht worden doorgestuurd. Gebruik de pijp “|
”Operator na de limit string in de eerste regel van het here document. We gaan de uitvoer van het hier document commando pijpen, cat
, in sed
We willen alle gevallen van de letter “a” vervangen door de letter “e”.
Noem dit script ‘heredoc-5.sh’.
#!/bin/bash cat << _end_of_text | sed 's/a/e/g' How To Gaak _end_of_text
./heredoc-5.sh
“Gaak” is gecorrigeerd naar “Geek”.
Parameters naar een functie verzenden
Het commando dat wordt gebruikt met een here-document kan een functie in het script zijn.
Dit script geeft enkele voertuiggegevens door aan een functie. De functie leest de gegevens alsof ze door een gebruiker zijn getypt. De waarden van de variabelen worden vervolgens afgedrukt. Bewaar dit script 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
De voertuigdetails worden naar het terminalvenster geschreven.
Een e-mail maken en verzenden
We kunnen een hier document gebruiken om een e-mail op te stellen en te verzenden. Merk op dat we parameters kunnen doorgeven aan de opdracht vóór de omleidingsoperator. We gebruiken Linux mail
commando om een e-mail te sturen via het lokale mailsysteem naar het gebruikersaccount met de naam “dave”. De -s
Met de optie (onderwerp) kunnen we het onderwerp voor de e-mail specificeren.
Dit voorbeeld vormt het script ‘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
Er is geen zichtbare uitvoer van dit script. Maar als we onze e-mail controleren, zien we dat de e-mail is samengesteld, verzonden en afgeleverd.
Hier gebruiken documenten met SSH
Hier zijn documenten een krachtige en gemakkelijke manier om sommige opdrachten op een externe computer uit te voeren zodra er een SSH-verbinding tot stand is gebracht. Als u SSH-sleutels tussen de twee computers heeft ingesteld, verloopt het inlogproces volledig automatisch. In dit snelle en vuile voorbeeld wordt u gevraagd om het wachtwoord voor het gebruikersaccount op de externe computer.
Dit script is “heredoc-8.sh”. We gaan verbinding maken met een externe computer genaamd “remote-pc”. Het gebruikersaccount heet “dave”. We gebruiken de -T
(schakel pseudo-terminaltoewijzing uit) omdat we geen interactieve pseudo-terminal nodig hebben om aan ons te worden toegewezen.
In het gedeelte “doe wat werk hier” van het script, zouden we een lijst met opdrachten kunnen doorgeven, en deze zouden op de externe computer worden uitgevoerd. Je zou natuurlijk gewoon een script kunnen bellen dat op de externe computer stond. Het externe script kan alle opdrachten en routines bevatten die u wilt laten uitvoeren.
Alles wat ons script – heredoc-8.sh – gaat doen, is een verbindingslog op de externe computer bijwerken. Het gebruikersaccount en een tijd- en datumstempel worden in een tekstbestand vastgelegd.
#!/bin/bash ssh -T dave@remote-pc.local << _remote_commands # do some work in here # update connection log echo $USER "-" $(date) >> /home/dave/conn_log/script.log _remote_commands
Wanneer we de opdracht uitvoeren, wordt ons gevraagd om het wachtwoord voor het account op het afgelegen computer.
./heredoc-8.sh
Er wordt wat informatie over de externe computer weergegeven en we keren terug naar de opdrachtprompt.
Op de afgelegen computer, kunnen we gebruiken cat
om het verbindingslogboek te controleren:
cat conn_log/script.log
Elke verbinding wordt voor ons opgesomd.
VERWANT: SSH-sleutels maken en installeren vanuit de Linux-shell
Vreemde naam, nette functies
Hier zijn documenten eigenzinnig maar krachtig, vooral wanneer ze worden gebruikt om opdrachten naar een externe computer te sturen. Het zou eenvoudig zijn om een back-uproutine te scripten met rsync
Het script kan dan verbinding maken met de externe computer, de resterende opslagruimte controleren en een waarschuwingsmail sturen als de ruimte bijna op is.
VERWANT: Hoe u een back-up van uw Linux-systeem maakt