
Bash и другие оболочки Linux поражают возможностями управления потоками данных через перенаправление ввода-вывода. Многие используют базовые методы работы с вводом, но, как водится в Linux, за простым иногда скрываются интересные и полезные тонкости.
Как работает перенаправление ввода через <
Одной из первых «неочевидных фишек» командной строки становится перенаправление ввода. С его помощью вы можете передавать данные в программу не вручную и не через pipe, а напрямую из файла.
Многие утилиты, например cat, сразу принимают имя файла аргументом:
Но есть и такие утилиты, как tr, что работают иначе. Man-страница tr гласит: программа «копирует стандартный ввод в стандартный вывод, одновременно заменяя или удаляя указанные символы». Обычно ей пользуются вот так:
Так что чаще всего tr используют двумя способами: либо вводят текст вручную, либо (намного практичнее — особенно в скриптах) передают данные через конвейер:
В этом примере мы используем cat, чтобы считать файл и отправить его содержимое дальше по цепочке. Но есть способ проще — воспользоваться перенаправлением ввода:
Здесь символ < открывает указанный файл как стандартный ввод (file descriptor 0) и предоставляет его команде tr.
Here document с помощью <<
Если вы уже писали скрипты на bash или просто сталкивались с многострочными текстами, наверняка задумывались: как удобно с ними работать? Конечно, можно исхитриться с экранированием, но куда проще воспользоваться here document:
Слово после знака «<<" — это специальный маркер, которым вы завершаете блок текста.
На первый взгляд кажется, что это совсем другая операция — будто мы «склеиваем» многострочный текст в один. Но here doc — это по сути всё то же перенаправление ввода. В данном примере мы используем cat, а не echo: echo просто выводит свои аргументы, а cat «читает» стандартный ввод — и именно этого нам нужно.
Легко проверить, что произойдет, если попробовать то же самое с echo:
" prefix to each line until the delimiter is entered.» data-img-url=»https://static0.howtogeekimages.com/wordpress/wp-content/uploads/2026/01/heredoc-echo.png?q=70&fit=crop&w=825&dpr=1″ src=»https://static0.howtogeekimages.com/wordpress/wp-content/uploads/2026/01/heredoc-echo.png?q=70&fit=crop&w=825&dpr=1″ class=»img-brightness-opt-out»>
В этой ситуации оболочка покажет другое приглашение — тем самым ожидая многострочный ввод. В Bash это просто символ “>”, а в zsh — “heredoc>”, как видно на скриншоте.
Echo не работает со стандартным вводом, поэтому на выходе — пустая строка. То же самое произойдёт, если соединить команды в конвейер:
А вот cat с here doc сразу выводит весь текст на экран:
Загадочный <<< и here string
Даже если вы легко оперируете heredoc, возможно, с here string ещё не сталкивались — хотя работает он очень похоже, только для одной строки:
Попытка использовать cat с here string не даёт результата: это все равно, что сделать echo привет, | cat мир. Обязательно заключайте текст в кавычки, если в нём есть пробелы.
Так как здесь ожидается всего одна строка, никаких дополнительных ограничителей не нужно. Как и в heredoc, here string понимает подстановку переменных — и это здорово расширяет возможности:
Так зачем всё это? Во-первых, такой подход гораздо быстрее и надёжнее, чем использовать конвейеры:
Когда вы запускаете команды через pipe, оболочка создаёт лишние процессы и связывает их между собой. Иногда это нужно, но если вам просто требуется передать текст — перегружать систему избыточно. Here string избавляет от этой ненужной работы.
Во-вторых, такой синтаксис делает скрипт чище и нагляднее: вместо того чтобы “колхозить” через echo или cat, вы прямо даёте Bash понять — вот тут надо взять этот текст и передать дальше.
Подпишитесь на рассылку — и узнавайте ещё больше неожиданных трюков с shell-перенаправлением!
Here string отлично подходит, когда нужно быстро подставить временный текст для отладки. Например, команда для поиска шаблона в строке:
Пока вы «гоняете» паттерн, удобно сразу подставлять подопытный текст через here string — это реально экономит время. Когда всё заработает, можно заменить его привычной работой с файлами:
Синтаксис практически не поменяется, а команды останутся такими же логичными и простыми.
Однако иногда here string — не просто удобство, а настоящая находка. Возьмём, например, встроенную команду read:
Кажется, что после выполнения переменная $greeting должна получить значение привет. Но не всё так просто:
Дело в том, что read в этом случае запускается в отдельном процессе — и результат в основную оболочку не попадает, переменная так и остаётся пустой. А если использовать here string — всё сработает правильно:
Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!
Премиум подписка — это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!
Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь
Также подписывайтесь на нас в:
- Telegram: https://t.me/gergenshin
- Youtube: https://www.youtube.com/@gergenshin
- Яндекс Дзен: https://dzen.ru/gergen
- Официальный сайт: https://www-genshin.ru






