При написании сценариев оболочки вы можете оказаться в ситуации, когда вам нужно передать многострочный блок текста или кода интерактивной команде, такой как tee, cat или sftp.
В Bash и других оболочках, таких как Zsh, документ Here (Heredoc) — это тип перенаправления, который позволяет передавать в команду несколько строк ввода.
Синтаксис написания HereDoc принимает следующую форму:
[COMMAND] <<[-] 'DELIMITER' HERE-DOCUMENT DELIMITER
В этом разделе мы рассмотрим некоторые основные примеры использования heredoc.
Heredoc чаще всего используется в сочетании с командой cat.
В следующем примере мы передаем две строки текста, содержащие переменную окружения и команду cat, используя документ here.
cat << EOF Текущий рабочий каталог: $PWD Вы вошли как: $(whoami) EOF
Как видно из вывода ниже, переменная и команда заменяются:
Текущий рабочий каталог: /home/andreyex Вы вошли как: andreyex
Посмотрим, что произойдет, если мы заключим разделитель в одинарные или двойные кавычки.
cat <<- "EOF" Текущий рабочий каталог: $PWD Вы вошли как: $(whoami) EOF
Вы можете заметить, что когда в качестве разделителя указывается в кавычках, расширение параметров не выполняется, а подстановка команд выполняется оболочкой.
Текущий рабочий каталог: $PWD Вы вошли как: $(whoami)
Если вы используете heredoc внутри оператора или цикла, используйте операцию перенаправления <<-, которая позволяет сделать отступ в вашем коде.
if true; then cat <<- EOF Строка с ведущей вкладкой. EOF fi
Строка с ведущей вкладкой.
Вместо отображения вывода на экране вы можете перенаправить его в файл , используя оператор >, >>.
cat << EOF > file.txt Текущий рабочий каталог: $PWD Вы вошли как: $(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.
При использовании разделителя без кавычек убедитесь, что вы экранировали все переменные, команды и специальные символы, иначе они будут интерполированы локально
ssh -T user@host.com << EOF echo "Текущий локальный рабочий каталог: $PWD" echo "Текущий удаленный рабочий каталог: \$PWD" EOF
Текущий локальный рабочий каталог: /home/andreyex Текущий удаленный рабочий каталог: /home/user
Вы также можете настроить аутентификацию на основе ключей SSH и подключаться к серверам Linux без ввода пароля.
Из этой статьи вы узнали, что такое heredoc и как его использовать в сценариях оболочки.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.