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

Окно терминала в компьютерной системе Linux.Фатмавати Ахмад Дзэнури / Shutterstock«Здесь документы» со странным названием позволяют использовать перенаправление ввода / вывода внутри сценариев Bash в Linux. Это отличный способ автоматизировать команды, которые нужно запускать на удаленном компьютере.

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

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

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

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

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

Идиоматическое представление здесь документа выглядит так:
КОМАНДА << limit_string. . переменные текстовых данных. . limit_string

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

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

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

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

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

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

Мы можем сделать то же самое в сценарии. Введите или скопируйте этот пример в редактор, сохраните файл как «heredoc-1.sh» и закройте редактор.
#! / bin / bash cat << «_end_of_text» Ваше имя пользователя: $ (whoami) Ваш текущий рабочий каталог: $ PWD Ваша версия Bash: $ BASH_VERSION _end_of_text
Следуя этой статье, каждый раз, когда вы создаете сценарий, вам необходимо: сделать его исполняемым прежде, чем он запустится. В каждом случае используйте команду chmod. Замените имя сценария в каждом примере на имя сценария, используемое здесь.
chmod + x heredoc-1.sh

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

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

Если вы измените сценарий и заключите строку ограничения в первой строке документа здесь в кавычки «» «, список данных передается в команду документа здесь дословно. Вместо значений переменных отображаются имена переменных, и подстановка команд будет не состоится.
#! / bin / bash cat << — «_end_of_text» Ваше имя пользователя: $ (whoami) Ваш текущий рабочий каталог: $ PWD Ваша версия Bash: $ BASH_VERSION _end_of_text

Обработка символов вкладки

По умолчанию символы табуляции в вашем списке данных будут сохранены и записаны в окно терминала. Скопируйте и сохраните этот пример как «heredoc-2.sh». Сделайте его исполняемым с помощью команды chmod. Отредактируйте строки с отступом, чтобы убедиться, что они содержат один или два символа табуляции в начале строки, а не серию пробелов.
#! / bin / bash cat << _end_of_text Ваше имя пользователя: $ (whoami) Ваш текущий рабочий каталог: $ PWD Ваша версия Bash: $ BASH_VERSION _end_of_text ./heredoc-2.sh

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

Если добавить дефис «-» к оператору перенаправления, здесь документ будет игнорировать начальные символы табуляции. Сохраните этот пример как «heredoc-3.sh» и сделайте его исполняемым.
#! / bin / bash cat << — _end_of_text Ваше имя пользователя: $ (whoami) Ваш текущий рабочий каталог: $ PWD Ваша версия Bash: $ BASH_VERSION _end_of_text ./heredoc-3.sh

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

Циклы и другие логические конструкции обычно имеют отступ. Если ваш документ здесь содержится в разделе сценария с отступом, использование тире «-» с оператором перенаправления устраняет проблемы форматирования, вызванные начальными символами табуляции.
#! / bin / bash если правда; then cat << — _limit_string Строка 1 с ведущей табуляцией. Строка 2 с ведущей табуляцией. Строка 3 с ведущей табуляцией. _limit_string fi

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

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

Это сценарий «heredoc-4.sh». Он перенаправит свой вывод в текстовый файл с именем «session.txt».
#! / bin / bash cat << _end_of_text> session.txt Ваше имя пользователя: $ (whoami) Ваш текущий рабочий каталог: $ PWD Ваша версия Bash: $ BASH_VERSION _end_of_text ./heredoc-4.sh cat session.text

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

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

Назовите этот сценарий «heredoc-5.sh».
#! / bin / bash cat << _end_of_text | sed ‘s / a / e / g’ Как сделать Gaak _end_of_text ./heredoc-5.sh
«Гаак» исправлено на «Компьютерщик».

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

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

Этот сценарий передает некоторые данные об автомобиле в функцию. Функция считывает данные, как если бы они были введены пользователем. Затем печатаются значения переменных. Сохраните этот сценарий как «heredoc-6.sh».
#! / bin / bash # функция set_car_details () set_car_details () {read make read model read new_used read delivery_collect место чтения цена чтения} # Здесь документ, который передает данные в set_car_details () set_car_details << _mars_rover_data NASA Perseverance Rover Used Collect Mars (long, lat) 77.451865,18.445161 2,2 миллиарда _mars_rover_data # Получить данные о транспортном средстве echo «Make: $ make» echo «Модель: $ model» echo «Новое или бывшее в употреблении: $ new_used» echo «Доставка или сбор: $ delivery_collect» echo «Location: $ location» echo «Price $: $ price» ./heredoc-6.sh

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

Создание и отправка электронного письма

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

В этом примере создается сценарий «heredoc-7.sh».
#! / bin / bash article = «Здесь Документы» mail -s ‘Статус загрузки’ dave << _project_report Имя пользователя: $ (whoami) Выполнено задание: Статья: $ article _project_report ./heredoc-7.sh

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

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

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

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

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

Все, что будет делать наш сценарий — heredoc-8.sh — — это обновлять журнал подключений на удаленном компьютере. Учетная запись пользователя, а также отметка времени и даты записываются в текстовый файл.
#! / bin / bash ssh -T dave@remote-pc.local << _remote_commands # поработайте здесь # обновите журнал подключений echo $ USER «-» $ (date) >> / home / dave / conn_log / script. журнал _remote_commands
Когда мы запускаем команду, нам предлагается ввести пароль для учетной записи на удаленный компьютер.
./heredoc-8.sh

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

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

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

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

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

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *