# Here-doc и here-string: данные внутри скрипта _Процессы и ресурсы · LinuxLab Knowledge Base_ **TL;DR:** Here-doc (`< /etc/myapp/config.ini [server] host = localhost port = 8080 user = ${USER} EOF ``` Всё между `<`). `EOF` - просто маркер, можно использовать любое слово (`END`, `DONE`, `__SCRIPT__`). ## Раскрытие переменных: с кавычками или без По умолчанию `${VAR}` и `$(...)` **раскрываются** внутри here-doc: ```bash cat < 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 < file.txt\nbody...\nEOF ``` Записать многострочный текст в файл без раскрытия переменных ```bash ssh host bash <