Cum să utilizați „Aici documentele” în Bash pe Linux
Publicat: 2022-01-29Denumitele 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 comandacat
, 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.
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
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.
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
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ță
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