Jak korzystać z „Tutaj dokumentów” w Bash w systemie Linux

Opublikowany: 2022-01-29
Okno terminala w systemie komputerowym Linux.
Fatmawati Achmad Zaenuri/Shutterstock

Dziwnie nazwane „dokumenty tutaj” pozwalają używać przekierowania wejścia / wyjścia w skryptach Bash w systemie Linux. To świetny sposób na zautomatyzowanie poleceń, które musisz uruchomić na zdalnym komputerze.

Tutaj dokumenty

Wiele poleceń w Linuksie ma dwu- lub trzyliterowe nazwy. Częściowo to daje podstawę do przekonania, że ​​Linux jest trudny do nauczenia i pełen tajemnych poleceń. Ale jedna z najdziwniejszych nazw w Linuksie nie jest jedną z tajemniczo krótkich. „Dokumenty tutaj” nie są dokumentami i tak naprawdę nie jest jasne, do czego odnosi się „tutaj”.

Są stosunkowo niejasną konstrukcją, ale są przydatne. Oczywiście jest to Linux, więc jest więcej niż jeden sposób na oskórowanie kota. Niektóre z funkcji udostępnianych w tych dokumentach można odtworzyć w inny sposób. Te alternatywne metody są zwykle bardziej skomplikowane. W programowaniu i pisaniu skryptów „bardziej skomplikowany” oznacza również „bardziej podatny na błędy” i że Twój kod jest trudniejszy w utrzymaniu.

Tutaj dokumenty naprawdę wyróżniają się w automatyzacji poleceń, które chcesz wysłać do zdalnego komputera z połączenia nawiązanego z poziomu skryptu. Nawiązanie połączenia jest łatwe, ale po nawiązaniu połączenia, jak „przepompować” polecenia ze skryptu do powłoki na zdalnym komputerze? Tutaj dokumenty pozwalają to zrobić w bardzo prosty sposób.

Podstawowe zasady tutaj dokumentów

Idiomatyczna reprezentacja dokumentu tutaj wygląda tak:

 POLECENIE << limit_ciąg
 .
 .
tekst 
dane
zmienne
.
.
limit_ciąg
  • POLECENIE : może to być dowolne polecenie systemu Linux, które akceptuje przekierowane dane wejściowe. Uwaga, polecenie echo nie akceptuje przekierowanych danych wejściowych. Jeśli chcesz pisać na ekranie, możesz użyć polecenia cat , które to robi.
  • << : Operator przekierowania.
  • limit_string : To jest etykieta. Może być dowolny, o ile nie pojawia się na liście danych, które przekierowujesz do polecenia. Służy do oznaczania końca listy tekstów, danych i zmiennych.
  • Lista danych : lista danych, które mają zostać przekazane do polecenia. Może zawierać polecenia, tekst i zmienne. Zawartość listy danych jest wprowadzana do polecenia po jednym wierszu na raz, aż do napotkania ciągu _limit_string.
Reklama

Prawdopodobnie zobaczysz przykłady takich dokumentów, w których jako ciąg ograniczający użyto „EOF”. Nie popieramy takiego podejścia. Działa, ale „EOF” oznacza „Koniec pliku”. Poza rzadkim przypadkiem, w którym dokument domowy jest ostatnią rzeczą w pliku skryptu, „EOF” jest używany błędnie.

Sprawi to, że twoje skrypty będą bardziej czytelne, jeśli użyjesz ciągu ograniczającego, który odnosi się do tego, co robisz. Jeśli wysyłasz serię poleceń do zdalnego komputera przez Secure Shell (SSH), ciąg ograniczający o nazwie „_remote_commands” będzie miał sens. Nie musisz zaczynać ich znakiem podkreślenia „ _ ”. Robimy to, ponieważ oznacza to, że w twoim skrypcie jest to coś niezwykłego.

Proste przykłady

Możesz używać tutaj dokumentów w wierszu poleceń oraz w skryptach. Gdy wpiszesz następujące polecenie w oknie terminala, zobaczysz monit „ > ” o kontynuację wiersza za każdym razem, gdy naciśniesz „Enter”. Gdy wpiszesz ciąg limitu „_end_of_text” i naciśniesz „Enter”, lista stron internetowych jest przekazywana do cat, i są one wyświetlane w oknie terminala.

 kot << _koniec_tekstu 
Poradnik 
Recenzja Geek 
ŻycieSave 
ChmuryZorientowane na IT
MindBounce
_end_of_text 

To nie jest najbardziej wartościowe ćwiczenie, ale pokazuje, że nic nie jest wysyłane do polecenia, dopóki cała lista danych nie zostanie posortowana i napotkany zostanie łańcuch ograniczający. Polecenie cat nie otrzyma żadnych danych wejściowych, dopóki nie wprowadzisz ciągu ograniczającego „_end_of_text” i nie naciśniesz klawisza „Enter”.

To samo możemy zrobić w skrypcie. Wpisz lub skopiuj ten przykład do edytora, zapisz plik jako „heredoc-1.sh” i zamknij edytor.

 #!/kosz/bash

kot << "_koniec_tekstu"
Twoja nazwa użytkownika to: $(whoami)
Twój aktualny katalog roboczy to: $PWD
Twoja wersja Bash to: $BASH_VERSION
_end_of_text

Zgodnie z tym artykułem, za każdym razem, gdy tworzysz skrypt, musisz sprawić, by był wykonywalny, zanim zostanie uruchomiony. W każdym przypadku użyj polecenia chmod . Zastąp nazwę skryptu w każdym przykładzie zamiast używanej tutaj nazwy skryptu.

 chmod +x heredoc-1.sh 

Reklama

Ten skrypt zawiera dwie zmienne środowiskowe, $PWD i $BASH_VERSION . Nazwy zmiennych środowiskowych są zastępowane ich wartościami danych — bieżącym katalogiem roboczym i wersją Bash — podczas wykonywania skryptu.

Skrypt używa również podstawiania poleceń w poleceniu whoami . Nazwa polecenia jest zastępowana własnymi danymi wyjściowymi. Dane wyjściowe całego skryptu są zapisywane w oknie terminala za pomocą polecenia cat. Skrypt uruchamiamy nazywając go po imieniu:

 ./heredoc-1.sh 

Jeśli zmodyfikujesz skrypt i umieścisz ciąg ograniczający w pierwszym wierszu dokumentu tutaj w cudzysłów „ " ”, lista danych jest przekazywana dosłownie do polecenia dokumentu tutaj. Nazwy zmiennych są wyświetlane zamiast wartości zmiennych, a podstawianie poleceń nie mieć miejsca.

 #!/kosz/bash

kot <<- "_koniec_tekstu"
Twoja nazwa użytkownika to: $(whoami)
Twój aktualny katalog roboczy to: $PWD
Twoja wersja Bash to: $BASH_VERSION
_end_of_text
 ./heredoc-1.sh 

Obsługa znaków tabulacji

Domyślnie znaki tabulacji na liście danych zostaną zachowane i zapisane w oknie terminala. Skopiuj i zapisz ten przykład jako „heredoc-2.sh”. Spraw, aby był wykonywalny za pomocą polecenia chmod . Edytuj wcięte wiersze, aby upewnić się, że mają jeden lub dwa znaki tabulacji na początku wiersza, a nie ciąg spacji.

 #!/kosz/bash

kot << _koniec_tekstu
Twoja nazwa użytkownika to: $(whoami)
  Twój aktualny katalog roboczy to: $PWD
    Twoja wersja Bash to: $BASH_VERSION
_end_of_text
 ./heredoc-2.sh 

Karty są zapisywane w oknie terminala.

Dodając myślnik „ - ” do operatora przekierowania, dokument w tym miejscu zignoruje wiodące znaki tabulacji. Zapisz ten przykład jako „heredoc-3.sh” i spraw, aby był wykonywalny.

 #!/kosz/bash

kot <<- _koniec_tekstu
Twoja nazwa użytkownika to: $(whoami)
  Twój aktualny katalog roboczy to: $PWD
    Twoja wersja Bash to: $BASH_VERSION
_end_of_text
 ./heredoc-3.sh 

Karty są ignorowane. Może się to wydawać trywialne, ale jest to fajny sposób na radzenie sobie z wiodącymi zakładkami ze względu na wcięte sekcje skryptów.

Reklama

Pętle i inne konstrukcje logiczne są zwykle wcięte. Jeśli twój dokument tutaj jest zawarty we wciętej sekcji skryptu, użycie myślnika „ - ” z operatorem przekierowania usuwa problemy z formatowaniem spowodowane przez wiodące znaki tabulacji.

 #!/kosz/bash

Jeśli prawda; następnie
  kot <<- _limit_string
  Linia 1 z wiodącą zakładką.
  Linia 2 z wiodącą zakładką.
  Linia 3 z wiodącą zakładką.
  _limit_ciąg
fi

Przekierowanie do pliku

Dane wyjściowe polecenia użytego w dokumencie tutaj można przekierować do pliku. Użyj operatorów przekierowania „ > ” (utwórz plik) lub „ >> ” (utwórz plik, jeśli nie istnieje, dołącz do pliku, jeśli istnieje) po łańcuchu ograniczającym w pierwszym wierszu dokumentu tutaj.

Ten skrypt to „heredoc-4.sh”. Przekieruje swoje dane wyjściowe do pliku tekstowego o nazwie „session.txt”.

 #!/kosz/bash

kot << _koniec_tekstu > sesja.txt
Twoja nazwa użytkownika to: $(whoami)
Twój aktualny katalog roboczy to: $PWD
Twoja wersja Bash to: $BASH_VERSION
_end_of_text
 ./heredoc-4.sh
 sesja kota.tekst 

Podłączanie wyjścia do innego polecenia

Dane wyjściowe polecenia użytego w dokumencie tutaj mogą być przesyłane jako dane wejściowe do innego polecenia. Użyj rury „ |po łańcuchu ograniczającym w pierwszym wierszu dokumentu tutaj. Przekażemy dane wyjściowe z polecenia here document, cat , do sed . Chcemy zastąpić wszystkie wystąpienia litery „a” literą „e”.

Nazwij ten skrypt „heredoc-5.sh”.

 #!/kosz/bash

kot << _koniec_tekstu | sed 's/a/e/g'
W jaki sposób
Do
Gaak
_end_of_text
 ./heredoc-5.sh

„Gaak” jest poprawiony na „Geek”.

Wysyłanie parametrów do funkcji

Polecenie używane z dokumentem w tym miejscu może być funkcją w skrypcie.

Ten skrypt przekazuje pewne dane pojazdu do funkcji. Funkcja odczytuje dane tak, jakby zostały wpisane przez użytkownika. Wartości zmiennych są następnie drukowane. Zapisz ten skrypt jako „heredoc-6.sh”.

 #!/kosz/bash

# funkcja set_car_details()
set_car_details ()
{
przeczytaj markę
przeczytaj model
przeczytaj nowe_używane
przeczytaj dostawę_odbiór
przeczytaj lokalizację
przeczytaj cenę
}

# Dokument tutaj, który przekazuje dane do set_car_details()
set_car_details << _mars_rover_data
NASA
Łazik wytrwałości
Używany
Zebrać
Mars (długi, łac.) 77.451865,18.445161
2,2 miliarda
_mars_rover_data

# Pobierz szczegóły pojazdu
echo "Make: $make"
echo "Model: $model"
echo "Nowe lub używane: $new_used"
echo "Dostawa lub odbiór: $delivery_collect"
echo "Lokalizacja: $lokalizacja"
echo "Cena \$: $cena"
 ./heredoc-6.sh 

Szczegóły pojazdu są zapisywane w oknie terminala.

Tworzenie i wysyłanie wiadomości e-mail

Możemy użyć tutaj dokumentu do skomponowania i wysłania e-maila. Zauważ, że możemy przekazać parametry do polecenia przed operatorem przekierowania. Używamy polecenia mail systemu Linux, aby wysłać wiadomość e-mail przez lokalny system pocztowy na konto użytkownika o nazwie „dave”. Opcja -s (temat) pozwala nam określić temat wiadomości e-mail.

Ten przykład tworzy skrypt „heredoc-7.sh”.

 #!/kosz/bash

artykuł="Tutaj dokumenty"

mail -s 'Stan obciążenia' dave << _project_report
Nazwa użytkownika: $(whoami)
Ukończył zadanie:
Artykuł: $artykuł
_raport projektu
 ./heredoc-7.sh 

Reklama

Nie ma widocznych danych wyjściowych z tego skryptu. Ale kiedy sprawdzamy naszą pocztę, widzimy, że wiadomość została skomponowana, wysłana i dostarczona.

 Poczta 

Używanie tutaj dokumentów z SSH

Tutaj dokumenty są potężnym i wygodnym sposobem wykonywania niektórych poleceń na zdalnym komputerze po ustanowieniu połączenia SSH. Jeśli skonfigurowałeś klucze SSH między dwoma komputerami, proces logowania będzie w pełni automatyczny. W tym szybkim i brudnym przykładzie zostaniesz poproszony o podanie hasła do konta użytkownika na zdalnym komputerze.

Ten skrypt to „heredoc-8.sh”. Zamierzamy połączyć się ze zdalnym komputerem o nazwie „remote-pc”. Konto użytkownika nazywa się „dave”. Używamy opcji -T (wyłącz alokację pseudoterminalu), ponieważ nie potrzebujemy przypisywać nam interaktywnego pseudoterminalu.

W sekcji skryptu „zrób tu trochę pracy” moglibyśmy przekazać listę poleceń, które zostałyby wykonane na zdalnym komputerze. Oczywiście możesz po prostu wywołać skrypt, który był na zdalnym komputerze. Skrypt zdalny może zawierać wszystkie polecenia i procedury, które chcesz wykonać.

Wszystko, co nasz skrypt - heredoc-8.sh - zrobi, to zaktualizuje dziennik połączeń na zdalnym komputerze. Konto użytkownika oraz znacznik czasu i daty są rejestrowane w pliku tekstowym.

 #!/kosz/bash

ssh -T [email protected] << _remote_commands

# popracuj tutaj

# zaktualizuj dziennik połączeń
echo $USER "-" $(data) >> /home/dave/conn_log/script.log
_zdalne_polecenia
Reklama

Po uruchomieniu polecenia zostaniemy poproszeni o podanie hasła do konta na komputerze zdalnym .

 ./heredoc-8.sh 

Wyświetlane są pewne informacje o komputerze zdalnym i wracamy do wiersza polecenia.

Na zdalnym komputerze możemy użyć cat do sprawdzenia dziennika połączeń:

 kot conn_log/script.log 

Każde połączenie jest dla nas wymienione.

POWIĄZANE: Jak tworzyć i instalować klucze SSH z powłoki systemu Linux

Dziwna nazwa, schludne funkcje

Tutaj dokumenty są dziwaczne, ale potężne, zwłaszcza gdy są używane do wysyłania poleceń do zdalnego komputera. Prostą sprawą byłoby napisanie skryptu procedury tworzenia kopii zapasowej za pomocą rsync . Skrypt mógł następnie połączyć się ze zdalnym komputerem, sprawdzić pozostałą przestrzeń dyskową i wysłać wiadomość e-mail z ostrzeżeniem, jeśli miejsce się wyczerpie.

POWIĄZANE: Jak wykonać kopię zapasową systemu Linux za pomocą rsync