linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Процессы и ресурсы/heredoc

kb/processes ── Процессы и ресурсы ── beginner

Here-doc и here-string: данные внутри скрипта

Here-doc (`<<EOF ... EOF`) подаёт многострочный текст на stdin команды без временного файла. Here-string (`<<<`) - то же самое для одной строки.

view as markdownaka: here-document, here-string, heredoc-eof

Here-doc: многострочный stdin

Когда нужно скормить команде многострочный текст - без создания временного файла:

bash
cat <<EOF > /etc/myapp/config.ini
[server]
host = localhost
port = 8080
user = ${USER}
EOF

Всё между <<EOF и закрывающим EOF уходит на stdin команды (тут - cat, который пишет в файл через >). EOF - просто маркер, можно использовать любое слово (END, DONE, __SCRIPT__).

Раскрытие переменных: с кавычками или без

По умолчанию ${VAR} и $(...) раскрываются внутри here-doc:

bash
cat <<EOF
Hello, ${USER}!
Today is $(date +%F)
EOF

▸Hello, student!

▸Today is 2026-04-29

Если нужен литеральный текст без раскрытия - закавычь маркер:

bash
cat <<'EOF' > script.template
Hello, ${USER}!     # ← НЕ раскроется, останется как ${USER}
$HOME тоже         # ← НЕ раскроется
EOF

Это критично для генерации скриптов / шаблонов / Dockerfile-фрагментов где $VAR нужны как литеральный текст.

Подавление ведущих табов: <<-

Внутри отступленных блоков (if, function) here-doc выглядит ужасно потому что отступы попадают в текст. Решение - <<- (минус), bash обрежет ведущие табы (не пробелы):

bash
if [[ -d /etc ]]; then
    cat <<-EOF
		это сообщение
		с ведущими табами
		которые bash обрежет
	EOF
fi

Только табы. Если редактор подставляет пробелы - не сработает.

Here-string: <<< для одной строки

Однострочный аналог:

bash
grep apple <<< "i like apple pie"

▸grep читает "i like apple pie" из stdin как из файла

▸эквивалентно: echo "i like..." | grep apple, но БЕЗ pipe и без подпроцесса echo

Полезно для bc, jq, любой команды которая хочет stdin-данные:

bash
bc <<< "2 + 2"           # 4
jq '.name' <<< '{"name":"alice"}'   # "alice"

Типичные ошибки

  • Маркер с пробелами в конце - bash не закроет here-doc:
    bash
    cat <<EOF
    text
    EOF       <-- пробел после EOF! не закроется
  • <<- с пробелами вместо табов - не сработает обрезание.
  • Cross-platform: <<< есть в bash и zsh, в /bin/sh нет. Для POSIX-совместимости - printf '...' | cmd.

§ команды

bash
cat <<'EOF' > file.txt\nbody...\nEOF

Записать многострочный текст в файл без раскрытия переменных

bash
ssh host bash <<EOF\ncmd1\ncmd2\nEOF

Выполнить много команд на удалённом хосте одним подключением

bash
grep pattern <<< "$var"

Передать содержимое переменной в grep как stdin (без echo + pipe)

bash
python3 <<EOF\nimport sys\nprint(sys.version)\nEOF

Embedded-скрипт: запустить inline-Python из bash

§ см. также

  • file-descriptorsFile descriptors (stdin, stdout, stderr)File descriptor - целое число, через которое процесс обращается к открытому файлу/сокету/pipe. У каждого процесса 0/1/2 = stdin/stdout/stderr.
  • process-and-pidПроцесс и PIDПроцесс - это запущенная программа со своим PID, памятью, открытыми дескрипторами и UID. Все процессы образуют дерево, корень - init (PID 1).
  • bash-strict-modeBash strict mode: set -euo pipefailТри флага в начале bash-скрипта которые превращают его из «прощающего всё» в «упасть на первой же ошибке». Без них баги молча копятся.

§ упоминается в уроках

  • ›beginner-12-shell-scripting
  • ›intermediate-11-advanced-redirects
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки