heredoc и herestring
Тема дорожной карты · Bash
Встроенный документ (here document) в Bash перенаправляет многострочный блок текста как stdin в команду с помощью синтаксиса <<EOF ... EOF, что делает его идеальным для встраивания файлов конфигурации, SQL-запросов или многострочных сообщений непосредственно в shell-скрипты без создания временных файлов. Разделитель heredoc может быть любым словом — EOF, END, TEMPLATE — а его экранирование как <<'EOF' отключает интерполяцию переменных, чтобы блок передавался дословно, тогда как неэкранированная форма <<EOF раскрывает $variables, $(commands) и экранирующие последовательности внутри блока. Распространённый шаблон Bash-скриптов — cat <<EOF > config.yml для динамической генерации файлов конфигурации с подстановкой переменных, или ssh host <<EOF для отправки пакета команд на удалённый сервер Linux в одном подключении. Встроенные строки (<<<) перенаправляют одну строку как stdin — grep pattern <<< "$var" — избегая конвейера и дочернего процесса, что является незначительным улучшением производительности в плотных циклах автоматизации Bash. Как встроенные документы, так и встроенные строки — мощные инструменты shell-скриптов для чистой и читаемой генерации текста и многострочного ввода в командной строке Linux.
Как это работает
heredoc и herestring: > пишет (truncate), >> дописывает, < читает stdin из файла, 2> редиректит stderr, 2>&1 мержит stderr в stdout, &> редиректит оба (bash-расширение). Heredocs: <<EOF ... EOF (var-expanded), <<'EOF' ... EOF (literal). Here-strings: <<< (строка в stdin). Process substitution: <(cmd) и >(cmd) делают fifo-like файл. Tee делит вывод: cmd | tee file.
Когда применять
cmd 2>&1 | tee log.txt — увидеть + сохранить полный вывод. Heredocs — для multi-line строк/скриптов. cmd > out 2> err — захват stdout + stderr раздельно. Process substitution (diff <(cmd1) <(cmd2)) — для избежания temp-файлов, когда команды берут файлы как input.
Типичные ошибки
Ловушки heredoc и herestring: cmd > file 2>&1 vs cmd 2>&1 > file (порядок важен — первый открывает файл и для stderr, второй шлёт stderr туда, куда stdout был ДО редиректа); случайный clobber важного файла через > (используйте set -o noclobber и >| для override); >> к файлу, которым не владеете (silent fail в restricted-директориях).