Встроенный документ (here document)

14.05.2018

Теги: BashCLIheredocLinuxstdinПоток

Встроенный документ (here document) является специальной формой перенаправления ввода-вывода, которая позволяет передать список строк команде или программе. Конец встроенного документа выделяется «строкой-ограничителем», которая задается с помощью специальной последовательности символов <<. В качестве строки-ограничителя должна выбираться такая последовательность символов, которая не будет встречаться в теле «встроенного документа».

Ниже приведен простой пример применения данной конструкции, где каждая ввседенная строка передается команде wc в качестве стандартного потока ввода до тех пор, пока не встретится строка END-OF-DATA:

$ wc -l <<END-OF-DATA
> Первая строка текста
> Вторая строка теста
> Третья строка теста
> END-OF-DATA
3

Встроенные документы часто используются в сценариях:

#!/bin/bash
mail $* <<END-OF-MESSAGE
Это первая строка сообщения.
Это вторая строка сообщения.
Это третья строка сообщения.
END-OF-MESSAGE

Отправим это сообщение всем пользователям из файла users-list.txt:

$ ./send-message.sh $(cat users-list.txt)

Если внутри встроенного документа встречаются переменные, обратные кавычки и конструкция $(…), то переменные будут подставлены, а команды выполнены.

#!/bin/bash
cat <<END-OF-MESSAGE
Текущая директория: $PWD
Список файлов: $(ls -la $PWD)
END-OF-MESSAGE
$ ./pwd-ls.sh
Текущая директория: /home/evgeniy
Список файлов: итого 2952
..........

Если строка-ограничитель встроенного документа начинается с символа - (<<-END-OF-DATA), то это приводит к подавлению вывода символов табуляции (но не пробелов). Это может оказаться полезным при форматировании текста сценария для большей удобочитаемости.

#!/bin/bash
cat <<END-OF-MESSAGE
    Это первая строка сообщения.
    Это вторая строка сообщения.
    Это третья строка сообщения.
END-OF-MESSAGE
cat <<-END-OF-MESSAGE
    Это первая строка сообщения.
    Это вторая строка сообщения.
    Это третья строка сообщения.
END-OF-MESSAGE

Результат работы сценария:

$ ./message.sh
    Это первая строка сообщения.
    Это вторая строка сообщения.
    Это третья строка сообщения.
Это первая строка сообщения.
Это вторая строка сообщения.
Это третья строка сообщения.

Поиск: Bash • CLI • Linux • heredoc • stdin • Поток

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.