Как использовать «Здесь документы» в Bash в Linux
Опубликовано: 2022-01-29Странно названные «здесь документы» позволяют вам использовать перенаправление ввода/вывода внутри скриптов 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