Этот простой Bash-приём перевернул мои представления о вводе данных!

Tux, the Linux mascot, wearing sunglasses and peeking from behind a large terminal window on a bright blue background.-1

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 сразу выводит весь текст на экран:

The cat program run with a heredoc prints text from standard input once it is entered.

Загадочный <<< и 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 должна получить значение привет. Но не всё так просто:

A command that pipes a value into read, then outputs the resulting variable, which is still empty.

Дело в том, что read в этом случае запускается в отдельном процессе — и результат в основную оболочку не попадает, переменная так и остаётся пустой. А если использовать here string — всё сработает правильно:

The read command with a here string that correctly populates a variable.

Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!

Премиум подписка — это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!

Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь

Также подписывайтесь на нас в:

Алекс Бежбакин
Оцените автора
Добавить комментарий