Cum să utilizați „Aici documentele” în Bash pe Linux

Publicat: 2022-01-29
O fereastră de terminal pe un sistem informatic Linux.
Fatmawati Achmad Zaenuri/Shutterstock

Denumitele ciudat „documentele aici” vă permit să utilizați redirecționarea de intrare/ieșire în interiorul scripturilor Bash pe Linux. Sunt o modalitate excelentă de a automatiza comenzile pe care trebuie să le rulați pe un computer la distanță.

Aici Documente

Multe comenzi din Linux au nume de două sau trei litere. Aceasta este parțial ceea ce dă naștere la ideea că Linux este greu de învățat și plin de comenzi arcane. Dar unul dintre cele mai ciudate nume din Linux nu este unul dintre cele criptic de scurte. „Aici documentele” nu sunt documente și nici nu este clar la ce se referă „aici”.

Sunt o construcție relativ obscure, dar sunt utile. Desigur, acesta este Linux, așa că există mai multe modalități de a jupui o pisică. Unele dintre funcționalitățile oferite de documentele de aici pot fi reproduse în alte moduri. Aceste metode alternative sunt de obicei mai complicate. În programare și scripting, „mai complicat” înseamnă și „mai predispus la erori” și că codul tău este mai greu de întreținut.

Unde aici documentele excelează cu adevărat este în automatizarea comenzilor pe care doriți să le trimiteți către un computer la distanță dintr-o conexiune stabilită dintr-un script. Realizarea conexiunii este ușoară, dar odată ce conexiunea a fost realizată, cum vă „pompați” comenzile din scriptul dvs. în shell-ul computerului la distanță? Aici documentele vă permit să faceți asta foarte simplu.

Principiile de bază ale documentelor de aici

Reprezentarea idiomatică a unui document aici arată astfel:

 COMANDĂ << limit_string
 .
 .
text 
date
variabile
.
.
limit_string
  • COMANDĂ : Aceasta poate fi orice comandă Linux care acceptă intrare redirecționată. Rețineți, comanda echo nu acceptă intrare redirecționată. Dacă trebuie să scrieți pe ecran, puteți utiliza comanda cat , care o face.
  • << : Operatorul de redirecționare.
  • limit_string : Aceasta este o etichetă. Poate fi orice doriți, atâta timp cât nu apare în lista de date pe care le redirecționați în comandă. Este folosit pentru a marca sfârșitul listei de text, date și variabile.
  • Listă de date : o listă de date care urmează să fie transmise comenzii. Poate conține comenzi, text și variabile. Conținutul listei de date este introdus în comandă pe rând până când _limit_string este întâlnit.
Publicitate

Probabil că veți vedea exemple de documente aici care folosesc „EOF” ca șir limită. Noi nu favorizăm această abordare. Funcționează, dar „EOF” înseamnă „Sfârșitul fișierului”. În afară de cazul rar în care un document de acasă este ultimul lucru dintr-un fișier script, „EOF” este folosit în mod eronat.

Vă va face scripturile mult mai lizibile dacă utilizați un șir limită care se referă la ceea ce faceți. Dacă trimiteți o serie de comenzi către un computer la distanță prin Secure Shell (SSH), un șir limită numit ceva de genul „_remote_commands” ar avea perfect sens. Nu trebuie să le începeți cu un caracter de subliniere „ _ ”. Facem asta pentru că îi marchează ca fiind ceva ieșit din comun în scenariul tău.

Exemple simple

Puteți folosi aici documente pe linia de comandă și în scripturi. Când tastați următoarele într-o fereastră de terminal, veți vedea o solicitare de continuare a liniei „ > ” de fiecare dată când apăsați „Enter”. Când tastați șirul limită „_end_of_text” și apăsați „Enter”, lista de site-uri web este transmisă la cat, și acestea sunt afișate în fereastra terminalului.

 pisică << _sfârșitul_textului 
How-To Geek 
Recenzie Geek 
LifeSavvy 
CloudSavvy IT
MindBounce
_sfârșitul_textului 

Acesta nu este cel mai valoros exercițiu, dar demonstrează că nimic nu este trimis la comandă până când întreaga listă de date nu este adunată și nu este întâlnit șirul limită. Comanda cat nu primește nicio intrare până când nu introduceți șirul limită „_end_of_text” și apăsați tasta „Enter”.

Putem face același lucru într-un scenariu. Tastați sau copiați acest exemplu într-un editor, salvați fișierul ca „heredoc-1.sh” și închideți editorul.

 #!/bin/bash

pisică << „_end_of_text”
Numele dvs. de utilizator este: $(whoami)
Directorul dvs. actual de lucru este: $PWD
Versiunea dvs. Bash este: $BASH_VERSION
_sfârșitul_textului

Pe măsură ce urmăriți acest articol, de fiecare dată când creați un script, va trebui să îl faceți executabil înainte de a fi rulat. În fiecare caz, utilizați comanda chmod . Înlocuiți numele scriptului din fiecare exemplu cu numele scriptului folosit aici.

 chmod +x heredoc-1.sh 

Publicitate

Acest script conține două variabile de mediu, $PWD și $BASH_VERSION . Numele variabilelor de mediu sunt înlocuite cu valorile lor de date - directorul de lucru curent și versiunea Bash - atunci când scriptul este executat.

Scriptul folosește și înlocuirea comenzii la comanda whoami . Numele comenzii este înlocuit cu propria sa ieșire. Ieșirea din întregul script este scrisă în fereastra terminalului prin comanda cat. Rulem scriptul numindu-l pe nume:

 ./heredoc-1.sh 

Dacă modificați scriptul și includeți șirul limită în prima linie a documentului aici între ghilimele „ " „, lista de date este transmisă textului comenzii aici document. Numele variabilelor sunt afișate în loc de valorile variabilelor, iar înlocuirea comenzii va nu are loc.

 #!/bin/bash

pisica <<- "_end_of_text"
Numele dvs. de utilizator este: $(whoami)
Directorul dvs. actual de lucru este: $PWD
Versiunea dvs. Bash este: $BASH_VERSION
_sfârșitul_textului
 ./heredoc-1.sh 

Manipularea caracterelor de filă

În mod implicit, caracterele tabulatoare din lista dvs. de date vor fi reținute și scrise în fereastra terminalului. Copiați și salvați acest exemplu ca „heredoc-2.sh”. Faceți-l executabil folosind comanda chmod . Editați liniile indentate pentru a vă asigura că au unul sau două caractere de tabulație la începutul liniei, mai degrabă decât o serie de spații.

 #!/bin/bash

pisică << _sfârșitul_textului
Numele dvs. de utilizator este: $(whoami)
  Directorul dvs. actual de lucru este: $PWD
    Versiunea dvs. Bash este: $BASH_VERSION
_sfârșitul_textului
 ./heredoc-2.sh 

Filele sunt scrise în fereastra terminalului.

Adăugând o liniuță „ - ” la operatorul de redirecționare, documentul de aici va ignora caracterele de tabulatură de început. Salvați acest exemplu ca „heredoc-3.sh” și faceți-l executabil.

 #!/bin/bash

pisică <<- _sfârșitul_textului
Numele dvs. de utilizator este: $(whoami)
  Directorul dvs. actual de lucru este: $PWD
    Versiunea dvs. Bash este: $BASH_VERSION
_sfârșitul_textului
 ./heredoc-3.sh 

Filele sunt ignorate. Acest lucru poate părea banal, dar este o modalitate bună de a face față filelor principale din cauza secțiunilor indentate ale scripturilor.

Publicitate

Buclele și alte constructe logice sunt de obicei indentate. Dacă documentul dvs. de aici este conținut într-o secțiune indentată a unui script, folosirea liniuței „ - ” cu operatorul de redirecționare elimină problemele de formatare cauzate de caracterele de tabulație principale.

 #!/bin/bash

daca e adevarat; atunci
  cat <<- _limit_string
  Linia 1 cu o filă de început.
  Linia 2 cu o filă de început.
  Linia 3 cu o filă de început.
  _limit_string
fi

Redirecționarea către un fișier

Ieșirea din comanda utilizată cu documentul aici poate fi redirecționată într-un fișier. Utilizați operatorii de redirecționare „ > ” (creați fișierul) sau „ >> ” (creați fișierul dacă nu există, adăugați la fișier dacă există) după șirul limită din prima linie a documentului aici.

Acest script este „heredoc-4.sh”. Acesta își va redirecționa rezultatul către un fișier text numit „session.txt”.

 #!/bin/bash

cat << _end_of_text > session.txt
Numele dvs. de utilizator este: $(whoami)
Directorul dvs. actual de lucru este: $PWD
Versiunea dvs. Bash este: $BASH_VERSION
_sfârșitul_textului
 ./heredoc-4.sh
 sesiune pisica.text 

Conducte de ieșire către o altă comandă

Ieșirea din comanda utilizată într-un document aici poate fi transmisă ca intrare către o altă comandă. Utilizați țeava „ | ” operator după șirul limită din prima linie a documentului aici. Vom transfera rezultatul de la comanda aici document, cat , în sed . Dorim să înlocuim toate aparițiile literei „a” cu litera „e”.

Denumiți acest script „heredoc-5.sh”.

 #!/bin/bash

pisică << _sfârșitul_textului | sed 's/a/e/g'
Cum
La
Gaak
_sfârșitul_textului
 ./heredoc-5.sh

„Gaak” este corectat în „Geek”.

Trimiterea parametrilor unei funcții

Comanda care este utilizată cu un document aici poate fi o funcție din script.

Acest script trece unele date despre vehicul într-o funcție. Funcția citește datele ca și cum ar fi fost introduse de un utilizator. Valorile variabilelor sunt apoi tipărite. Salvați acest script ca „heredoc-6.sh”.

 #!/bin/bash

# funcția set_car_details().
set_car_details ()
{
citeste face
citeste modelul
citiți new_used
citește delivery_collect
citiți locația
citeste pretul
}

# Documentul de aici care transmite datele către set_car_details()
set_car_details << _mars_rover_data
NASA
Perseverance Rover
Folosit
Colectarea
Marte (long,lat) 77.451865,18.445161
2,2 miliarde
_mars_rover_data

# Preluați detaliile vehiculului
echo "Faceți: $faceți"
echo „Model: $model”
echo „Nou sau folosit: $new_used”
echo „Livrare sau colectare: $delivery_collect”
echo „Locație: $locație”
echo „Preț \$: $preț”
 ./heredoc-6.sh 

Detaliile vehiculului sunt scrise pe fereastra terminalului.

Crearea și trimiterea unui e-mail

Putem folosi un document aici pentru a scrie și a trimite un e-mail. Rețineți că putem trece parametri la comandă în fața operatorului de redirecționare. Utilizăm comanda de e- mail Linux pentru a trimite un e-mail prin sistemul local de e-mail către contul de utilizator numit „dave”. Opțiunea -s (subiect) ne permite să specificăm subiectul pentru e-mail.

Acest exemplu formează scriptul „heredoc-7.sh”.

 #!/bin/bash

article="Aici Documente"

mail -s „Starea sarcinii de lucru” dave << _project_report
Nume utilizator: $(whoami)
A finalizat sarcina:
Articol: $articol
_raportul proiectului
 ./heredoc-7.sh 

Publicitate

Nu există rezultate vizibile din acest script. Dar când ne verificăm e-mailul, vedem că e-mailul a fost compus, expediat și livrat.

 Poștă 

Utilizarea Here Documents cu SSH

Aici documentele sunt o modalitate puternică și convenabilă de a executa unele comenzi pe un computer la distanță odată ce a fost stabilită o conexiune SSH. Dacă ați configurat chei SSH între cele două computere, procesul de conectare va fi complet automat. În acest exemplu rapid și murdar, vi se va solicita parola pentru contul de utilizator de pe computerul de la distanță.

Acest script este „heredoc-8.sh”. Ne vom conecta la un computer la distanță numit „PC la distanță”. Contul de utilizator se numește „dave”. Folosim opțiunea -T (dezactivarea alocării pseudo-terminalului) deoarece nu avem nevoie de un pseudo-terminal interactiv care să ni se aloce.

În secțiunea „lucrați aici” a scriptului, am putea trece o listă de comenzi, iar acestea ar fi executate pe computerul de la distanță. Desigur, puteți apela doar un script care se afla pe computerul de la distanță. Scriptul de la distanță poate conține toate comenzile și rutinele pe care doriți să le executați.

Tot ceea ce va face scriptul nostru – heredoc-8.sh – este să actualizeze un jurnal de conexiune pe computerul de la distanță. Contul de utilizator și ștampila oră și dată sunt înregistrate într-un fișier text.

 #!/bin/bash

ssh -T [email protected] << _remote_commands

# lucrează aici

# actualizați jurnalul de conexiuni
echo $USER "-" $(data) >> /home/dave/conn_log/script.log
_comenzi_la distanță
Publicitate

Când rulăm comanda, ni se solicită parola pentru contul de pe computerul de la distanță .

 ./heredoc-8.sh 

Sunt afișate câteva informații despre computerul de la distanță și ne întoarcem la promptul de comandă.

Pe computerul de la distanță , putem folosi cat pentru a verifica jurnalul de conexiune:

 cat conn_log/script.log 

Fiecare conexiune este listată pentru noi.

LEGATE: Cum se creează și se instalează chei SSH din Shell Linux

Nume ciudat, caracteristici îngrijite

Aici documentele sunt ciudate, dar puternice, mai ales atunci când sunt folosite pentru a trimite comenzi către un computer la distanță. Ar fi o chestiune simplă să scrieți o rutină de backup folosind rsync . Scriptul se putea conecta apoi la computerul de la distanță, verifica spațiul de stocare rămas și trimite un e-mail de alertă dacă spațiul scade.

RELATE: Cum să faci o copie de rezervă a sistemului tău Linux cu rsync