Встроенный документ (here document)
Встроенный документ (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 Это первая строка сообщения. Это вторая строка сообщения. Это третья строка сообщения. Это первая строка сообщения. Это вторая строка сообщения. Это третья строка сообщения.