Введение
При написании сценариев оболочки вы можете оказаться в ситуации, когда вам нужно передать блок строк текста или кода интерактивной команде, такой как tee
, cat
или sftp
.
В Bash и других оболочках, таких как Zsh, документ Here (Heredoc) — это тип перенаправления, который позволяет передавать несколько строк ввода в команду.
Синтаксис сценария HereDoc имеет следующий вид:
[COMMAND] <<[-] 'DELIMITER'
HERE-DOCUMENT
DELIMITER
- Первая строка начинается с необязательной команды, за которой следует специальный оператор перенаправления
<<
и идентификатор-разделитель. - Любая строка может быть использована в качестве идентификатора-разделителя, чаще всего используются EOF или END.
- Если разделитель не заключен в кавычки, оболочка заменит все переменные, команды и специальные символы перед передачей строк документа здесь команде.
- При добавлении знака минус к оператору перенаправления
<<-
все основные символы табуляции будут игнорироваться. Это позволяет вам использовать отступы при написании документов здесь в сценариях оболочки. Основные пробелы не допускаются, только табуляция. - Блок здесь-документа может содержать строки, переменные, команды и любой другой тип ввода.
- Последняя строка заканчивается идентификатором-разделителем. Пробел перед разделителем не допускается.
Основные примеры 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/noviello
You are logged in as: noviello
Давайте посмотрим, что произойдет, если мы заключим разделитель в одинарные или двойные кавычки.
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
Если файл.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 [email protected] << 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/noviello
The current remote working directory is: /home/user
Вы также можете настроить аутентификацию на основе ключей SSH и подключаться к серверам Linux без ввода пароля.
Вывод
Из этого руководства вы узнали, что такое heredoc
и как его использовать в сценариях оболочки.