Как использовать «Здесь документы» в Bash в Linux

Опубликовано: 2022-01-29
Окно терминала в компьютерной системе Linux.
Фатмавати Ахмад Заэнури/Shutterstock

Странно названные «здесь документы» позволяют вам использовать перенаправление ввода/вывода внутри скриптов Bash в Linux. Это отличный способ автоматизировать выполнение команд на удаленном компьютере.

Здесь Документы

Многие команды в Linux имеют двух- или трехбуквенные имена. Отчасти это порождает мнение, что Linux трудно освоить и что он полон загадочных команд. Но одно из самых странных имен в Linux вовсе не загадочно короткое. «Здесь документы» не являются документами, и не совсем понятно, к чему относится «здесь».

Это относительно непонятная конструкция, но она полезна. Конечно, это Linux, так что есть несколько способов содрать с кота шкуру. Некоторые функциональные возможности, предоставляемые настоящими документами, могут быть воспроизведены другими способами. Эти альтернативные методы обычно более сложны. В программировании и скриптинге «более сложный» также означает «более подверженный ошибкам» и что ваш код сложнее поддерживать.

В чем документы действительно преуспевают, так это в автоматизации команд, которые вы хотите отправить на удаленный компьютер из соединения, установленного из скрипта. Установить соединение несложно, но как только соединение будет установлено, как вы «закачаете» свои команды из сценария в оболочку на удаленном компьютере? Здесь документы позволяют сделать это очень просто.

Основные принципы работы с здесь документами

Идиоматическое представление документа здесь выглядит следующим образом:

 КОМАНДА << предел_строка
 .
 .
текст 
данные
переменные
.
.
limit_string
  • КОМАНДА : Это может быть любая команда Linux, которая принимает перенаправленный ввод. Обратите внимание, что команда echo не принимает перенаправленный ввод. Если вам нужно написать на экран, вы можете использовать команду cat , которая делает это.
  • << : оператор перенаправления.
  • limit_string : это метка. Это может быть что угодно, если только оно не отображается в списке данных, которые вы перенаправляете в команду. Он используется для обозначения конца списка текста, данных и переменных.
  • Список данных : список данных, которые будут переданы команде. Он может содержать команды, текст и переменные. Содержимое списка данных передается в команду по одной строке за раз, пока не встретится _limit_string.
Реклама

Вы, вероятно, увидите здесь примеры документов, в которых в качестве строки ограничения используется «EOF». Мы не одобряем такой подход. Это работает, но «EOF» означает «Конец файла». Помимо редкого случая, когда домашний документ является последним в файле скрипта, «EOF» используется ошибочно.

Это сделает ваши сценарии более читабельными, если вы используете строку ограничения, которая относится к тому, что вы делаете. Если вы отправляете серию команд на удаленный компьютер через Secure Shell (SSH), строка ограничения, называемая чем-то вроде «_remote_commands», будет иметь смысл. Вам не нужно начинать их с символа подчеркивания « _ ». Мы делаем это, потому что это помечает их как нечто необычное в вашем сценарии.

Простые примеры

Вы можете использовать здесь документы в командной строке и в скриптах. Когда вы вводите следующее в окне терминала, вы будете видеть приглашение продолжения строки « > » каждый раз, когда нажимаете «Enter». Когда вы вводите строку ограничения «_end_of_text» и нажимаете «Enter», список веб-сайтов передается в cat, и они отображаются в окне терминала.

 кошка << _end_of_text 
Как Компьютерщик 
Обзор Компьютерщик 
LifeSavvy 
CloudSavvy IT
MindBounce
_end_of_text 

Это не самое полезное упражнение, но оно показывает, что команде ничего не отправляется до тех пор, пока не будет собран весь список данных и не встретится предельная строка. Команда cat не получает никакого ввода, пока вы не введете предельную строку «_end_of_text» и не нажмете клавишу «Enter».

Мы можем сделать то же самое в сценарии. Введите или скопируйте этот пример в редактор, сохраните файл как «heredoc-1.sh» и закройте редактор.

 #!/бин/баш

кошка << "_end_of_text"
Ваше имя пользователя: $(whoami)
Ваш текущий рабочий каталог: $PWD
Ваша версия Bash: $BASH_VERSION
_end_of_text

Следуя этой статье, каждый раз, когда вы создаете сценарий, вам нужно будет сделать его исполняемым, прежде чем он будет запущен. В каждом случае используйте команду chmod . Замените имя сценария в каждом примере на имя сценария, используемое здесь.

 chmod +x здесьdoc-1.sh 

Реклама

Этот сценарий содержит две переменные среды: $PWD и $BASH_VERSION . Имена переменных среды заменяются их значениями данных — текущим рабочим каталогом и версией Bash — при выполнении скрипта.

Сценарий также использует подстановку команд в команде whoami . Имя команды заменяется ее собственным выводом. Вывод всего скрипта записывается в окно терминала командой cat. Запускаем скрипт, вызывая его по имени:

 ./heredoc-1.sh 

Если вы измените сценарий и заключите строку ограничения в первой строке документа здесь в кавычках ” " “, список данных будет передан в команду документа здесь дословно. Вместо значений переменных отображаются имена переменных, а подстановка команд будет не состояться.

 #!/бин/баш

кошка <<- "_end_of_text"
Ваше имя пользователя: $(whoami)
Ваш текущий рабочий каталог: $PWD
Ваша версия Bash: $BASH_VERSION
_end_of_text
 ./heredoc-1.sh 

Обработка символов табуляции

По умолчанию символы табуляции в вашем списке данных будут сохранены и записаны в окно терминала. Скопируйте и сохраните этот пример как «heredoc-2.sh». Сделайте его исполняемым с помощью команды chmod . Отредактируйте строки с отступом, чтобы убедиться, что они имеют один или два символа табуляции в начале строки, а не серию пробелов.

 #!/бин/баш

кошка << _end_of_text
Ваше имя пользователя: $(whoami)
  Ваш текущий рабочий каталог: $PWD
    Ваша версия Bash: $BASH_VERSION
_end_of_text
 ./heredoc-2.sh 

Вкладки записываются в окно терминала.

При добавлении дефиса « - » к оператору перенаправления документ здесь будет игнорировать начальные символы табуляции. Сохраните этот пример как «heredoc-3.sh» и сделайте его исполняемым.

 #!/бин/баш

кошка <<- _end_of_text
Ваше имя пользователя: $(whoami)
  Ваш текущий рабочий каталог: $PWD
    Ваша версия Bash: $BASH_VERSION
_end_of_text
 ./heredoc-3.sh 

Вкладки игнорируются. Это может показаться тривиальным, но это отличный способ справиться с начальными вкладками из-за отступов разделов скриптов.

Реклама

Циклы и другие логические конструкции обычно имеют отступ. Если ваш здесь документ содержится в разделе сценария с отступом, использование тире « - » с оператором перенаправления устраняет проблемы форматирования, вызванные начальными символами табуляции.

 #!/бин/баш

если правда; тогда
  кошка <<- _limit_string
  Строка 1 с ведущей табуляцией.
  Строка 2 с ведущей табуляцией.
  Строка 3 с ведущей табуляцией.
  _limit_string
фи

Перенаправление в файл

Вывод команды, используемой с документом здесь, может быть перенаправлен в файл. Используйте операторы перенаправления « > » (создайте файл) или « >> » (создайте файл, если он не существует, добавьте к файлу, если он существует) после строки ограничения в первой строке документа здесь.

Этот сценарий называется «heredoc-4.sh». Он перенаправит свой вывод в текстовый файл с именем «session.txt».

 #!/бин/баш

кошка << _end_of_text > session.txt
Ваше имя пользователя: $(whoami)
Ваш текущий рабочий каталог: $PWD
Ваша версия Bash: $BASH_VERSION
_end_of_text
 ./heredoc-4.sh
 кошачья сессия.текст 

Передача вывода другой команде

Выходные данные команды, используемой в этом документе, могут быть переданы в качестве входных данных для другой команды. Используйте трубу « |после строки limit в первой строке документа здесь. Мы собираемся направить вывод команды here document, cat , в sed . Мы хотим заменить все вхождения буквы «а» на букву «е».

Назовите этот сценарий «heredoc-5.sh».

 #!/бин/баш

кошка << _end_of_text | sed 's/a/e/g'
Как
К
Гаак
_end_of_text
 ./heredoc-5.sh

«Gaak» исправлен на «Geek».

Отправка параметров в функцию

Команда, которая используется с здесь документом, может быть функцией в скрипте.

Этот скрипт передает некоторые данные о транспортном средстве в функцию. Функция считывает данные так, как если бы они были введены пользователем. Затем распечатываются значения переменных. Сохраните этот скрипт как «heredoc-6.sh».

 #!/бин/баш

# функция set_car_details()
set_car_details ()
{
читать делать
прочитать модель
читать новые_использованные
читать delivery_collect
читать местоположение
читать цену
}

# Вот документ, который передает данные в set_car_details()
set_car_details << _mars_rover_data
НАСА
Настойчивый вездеход
Использовал
Собирать
Марс (долгота,широта) 77.451865,18.445161
2,2 миллиарда
_mars_rover_data

# Получить информацию о транспортном средстве
эхо "Сделать: $ сделать"
эхо "Модель: $model"
echo "Новый или бывший в употреблении: $new_used"
echo "Доставка или сбор: $delivery_collect"
echo "Местоположение: $location"
echo "Цена \$: $price"
 ./heredoc-6.sh 

Информация о транспортном средстве записывается в окно терминала.

Создание и отправка электронной почты

Мы можем использовать здесь документ, чтобы составить и отправить электронное письмо. Обратите внимание, что мы можем передавать параметры команде перед оператором перенаправления. Мы используем mail команду Linux для отправки электронной почты через локальную почтовую систему на учетную запись пользователя с именем «dave». Опция -s (тема) позволяет указать тему письма.

Этот пример формирует скрипт «heredoc-7.sh».

 #!/бин/баш

article="Здесь документы"

mail -s 'Статус рабочей нагрузки' dave << _project_report
Имя пользователя: $(ктоами)
Выполнил задание:
Статья: $статья
_отчет о проекте
 ./heredoc-7.sh 

Реклама

Этот скрипт не дает видимых результатов. Но когда мы проверяем нашу почту, мы видим, что письмо было составлено, отправлено и доставлено.

 Почта 

Использование здесь документов с SSH

Здесь документы — это мощный и удобный способ выполнить некоторые команды на удаленном компьютере после установления соединения SSH. Если вы настроили ключи SSH между двумя компьютерами, процесс входа в систему будет полностью автоматическим. В этом быстром и грязном примере вам будет предложено ввести пароль для учетной записи пользователя на удаленном компьютере.

Этот скрипт называется «heredoc-8.sh». Мы собираемся подключиться к удаленному компьютеру под названием «remote-pc». Учетная запись пользователя называется «dave». Мы используем параметр -T (отключить выделение псевдотерминала), потому что нам не нужно назначать интерактивный псевдотерминал.

В разделе сценария «поработайте здесь» мы могли бы передать список команд, и они будут выполняться на удаленном компьютере. Конечно, можно было просто вызвать скрипт, который был на удаленном компьютере. Удаленный сценарий может содержать все команды и подпрограммы, которые вы хотите выполнить.

Все, что будет делать наш скрипт — heredoc-8.sh — это обновлять журнал подключений на удаленном компьютере. Учетная запись пользователя и отметка времени и даты записываются в текстовый файл.

 #!/бин/баш

ssh -T [email protected] << _remote_commands

# поработайте здесь

# обновить журнал подключений
echo $USER "-" $(дата) >> /home/dave/conn_log/script.log
_remote_commands
Реклама

Когда мы запускаем команду, нас просят ввести пароль для учетной записи на удаленном компьютере.

 ./heredoc-8.sh 

Отобразится некоторая информация об удаленном компьютере, и мы вернемся в командную строку.

На удаленном компьютере мы можем использовать cat для проверки журнала подключений:

 кошка conn_log/script.log 

Каждое соединение указано для нас.

СВЯЗАННЫЕ С: Как создать и установить ключи SSH из оболочки Linux

Странное имя, аккуратные черты

Здесь документы причудливы, но эффективны, особенно когда они используются для отправки команд на удаленный компьютер. Было бы просто написать сценарий процедуры резервного копирования с использованием rsync . Затем сценарий мог подключиться к удаленному компьютеру, проверить оставшееся место на диске и отправить электронное письмо с предупреждением, если места становится мало.

СВЯЗАННЫЕ С: Как сделать резервную копию вашей системы Linux с помощью rsync