
При написании сценариев оболочки вы можете оказаться в ситуации, когда вам необходимо передать многострочный блок текста или кода интерактивной команде, например tee , cat или sftp .
В Bash и других оболочках, таких как Zsh, Here-документ (Heredoc) — это тип перенаправления, позволяющий передавать команде несколько строк ввода.
Синтаксис написания HereDoc имеет следующий вид:
[ COMMAND ] << [ - ] 'DELIMITER' HERE-DOCUMENT DELIMITER
- Первая строка начинается с необязательной команды, за которой следует специальный оператор перенаправления
<<и идентификатор-разделитель.- В качестве разделительного идентификатора можно использовать любую строку, наиболее часто используемые — EOF или END.
- Если идентификатор-разделитель не заключен в кавычки, оболочка заменит все переменные, команды и специальные символы перед передачей строк документа команде.
- Добавление знака «минус» к оператору перенаправления
<<-приведёт к игнорированию всех начальных символов табуляции. Это позволяет использовать отступы при написании встроенных документов в скриптах оболочки. Начальные пробелы не допускаются, только табуляция.
- Блок here-document может содержать строки, переменные, команды и любые другие типы входных данных.
- Последняя строка заканчивается идентификатором-разделителем. Пробел перед разделителем не допускается.
Базовые примеры Heredoc
В этом разделе мы рассмотрим несколько основных примеров использования heredoc.
Heredoc чаще всего используется в сочетании с командой cat .
В следующем примере мы передаем две строки текста, содержащие переменную среды и команду cat , используя документ here.
cat << EOF The current working directory is: $PWD You are logged in as: $(whoami) EOF
Как видно из приведенного ниже вывода, подменяются и переменная, и вывод команды:
The current working directory is: /home/linuxize You are logged in as: linuxize
Давайте посмотрим, что произойдет, если мы заключим разделитель в одинарные или двойные кавычки.
cat <<- "EOF" The current working directory is: $PWD You are logged in as: $( whoami ) EOF
Вы можете заметить, что когда разделитель заключен в кавычки, оболочка не выполняет расширение параметров и подстановку команд.
The current working directory is: $PWD You are logged in as: $(whoami)
Если вы используете heredoc внутри оператора или цикла, используйте операцию перенаправления <<- , которая позволяет вам сделать отступ в вашем коде.
if true ; then cat <<- EOF Line with a leading tab. EOF fi
Line with a leading tab.
Вместо отображения вывода на экран вы можете перенаправить его в файл с помощью операторов > , >> .
cat << EOF > file.txt The current working directory is: $PWD You are logged in as: $(whoami) EOF
Если файл file.txt не существует, он будет создан. При использовании > файл будет перезаписан, а при использовании >> добавлен вывод к файлу.
Ввод heredoc также можно перенаправить. В следующем примере команда sed заменит все вхождения символа l на e :
cat <<'EOF' | sed 's/l/e/g' Hello World EOF
Heeeo Wored
Чтобы записать переданные данные в файл:
cat <<'EOF' | sed 's/l/e/g' > file.txt Hello World EOF
Использование Heredoc с SSH
Использование Heredoc — один из самых удобных и простых способов выполнения нескольких команд в удаленной системе через SSH .
При использовании разделителя без кавычек обязательно экранируйте все переменные, команды и специальные символы, иначе они будут интерполированы локально:
ssh -T user@host.com << EOF echo "The current local working directory is: $PWD" echo "The current remote working directory is: $PWD" EOF
The current local working directory is: /home/linuxize The current remote working directory is: /home/user
Вы также можете настроить аутентификацию на основе SSH-ключа и подключаться к своим серверам Linux без ввода пароля.
Заключение
В этом руководстве вы узнали, что такое heredoc и как использовать его в своих скриптах оболочки.
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства