Here (Heredoc) в Bash

При написании сценариев оболочки вы можете оказаться в ситуации, когда вам нужно передать многострочный блок текста или кода интерактивной команде, такой как tee , cat или sftp .

В Bash и других оболочках, таких как Zsh, документ Here (Heredoc) — это тип перенаправления, позволяющий передавать команде несколько строк ввода.

Синтаксис HereDoc

Синтаксис написания HereDoc имеет следующий вид:

[COMMAND] <<[-] 'DELIMITER'
  HERE-DOCUMENT
DELIMITER
  • Первая строка начинается с необязательной команды, за которой следует специальный оператор перенаправления << и ограничивающий идентификатор.
    • В качестве идентификатора-разделителя можно использовать любую строку, наиболее часто используемые — EOF или END.
    • Если ограничивающий идентификатор не заключен в кавычки, оболочка заменит все переменные, команды и специальные символы перед передачей команд здесь строк документа.
    • Добавление знака минус к оператору перенаправления <<- приведет к игнорированию всех ведущих символов табуляции. Это позволяет использовать отступы при написании здесь-документов в сценариях оболочки. Начальные пробелы не допускаются, только табуляция.
  • Блок здесь-документа может содержать строки, переменные, команды и любой другой тип ввода.
  • Последняя строка заканчивается идентификатором-разделителем. Пробелы перед разделителем не допускаются.

Основные примеры Heredoc

В этом разделе мы рассмотрим несколько основных примеров использования heredoc.

Heredoc чаще всего используется в сочетании с командой cat .

В следующем примере мы передаем в cat две строки текста, содержащие переменную среды и команду, используя здесь документ.

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 и как использовать его в сценариях оболочки.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Оставьте комментарий