Конвейер и tee
100%

Text-Fu · Урок 4

Конвейер и tee

Узнайте, как конвейеры соединяют команды, а tee сохраняет поток, одновременно передавая его дальше.

Конвейеры соединяют небольшие команды, позволяя данным проходить между ними без промежуточного файла. Команда tee может сохранить копию части такого потока в файл и одновременно передать данные дальше.

Соединение команд с помощью |

Предположим, список каталога слишком длинный, чтобы прочитать его целиком за один раз:

$ ls -la /etc

Поместите оператор конвейера | между командами, чтобы подключить stdout левой команды к stdin правой:

$ ls -la /etc | less

Оболочка запускает команды конвейера и настраивает соединение потоков. Команды могут работать одновременно: less начнёт чтение ещё до того, как ls сформирует весь список.

Какие потоки по умолчанию соединяет | в ls -la /etc | less?

Отдельный stderr

Обычный | передаёт только stdout. Stderr левой команды сохраняет прежнее назначение, которым часто является терминал:

$ find /etc -name "*.conf" | less

Найденные пути проходят через конвейер, а диагностические сообщения о правах доступа могут по-прежнему появляться прямо в терминале. Если нужно другое поведение, перенаправьте stderr отдельно:

$ find /etc -name "*.conf" 2> find-errors.log | less

Куда обычно направляется stderr команды find в find /etc -name "*.conf" | less, если других перенаправлений нет?

Копирование потока с помощью tee

tee читает stdin, записывает копию в каждый указанный файл и одновременно передаёт те же данные в stdout:

$ ls | tee listing.txt

Здесь listing.txt получает список, а stdout команды tee остаётся подключённым к терминалу. По умолчанию tee создаёт или усекает указанный файл, как и >.

Какая команда отображает вывод generate-report и одновременно заменяет им содержимое report.txt?

Используйте -a, если данные нужно добавить в конец файла, а не заменить его:

$ date | tee -a activity.log

Какая команда отображает текущую дату и добавляет её в activity.log?

Сохранение промежуточного результата

Поместите tee в середину конвейера, чтобы сохранить промежуточный поток и продолжить его обработку:

$ ls -la /etc | tee etc-listing.txt | grep "conf"

Этот конвейер:

  1. Формирует полный подробный список.
  2. Сохраняет весь поток в etc-listing.txt.
  3. Передаёт тот же поток в grep, который выводит только строки с conf.

Файл содержит данные до фильтрации командой grep. Если в файл нужны только отфильтрованные строки, поместите tee после grep.

Что будет содержать all.txt после успешного выполнения produce | tee all.txt | grep error?

Чтобы попрактиковаться с конвейерами и копированием потоков, выполните лабораторные работы:

  1. Перенаправление ввода и вывода в Linux — потренируйтесь управлять stdout, stderr и stdin с помощью операторов >, >>, 2> и команды tee.
  2. Управление последовательностью и конвейеры — научитесь управлять последовательностями команд, использовать конвейеры и инструменты обработки текста cut, grep, wc, sort и uniq.
  3. Перенаправление потоков данных — освойте управление стандартными потоками ввода, вывода и ошибок, объединение вывода и применение /dev/null.

Урок завершён

Вы завершили Конвейер и tee

Теперь вы можете соединять команды и сохранять выбранные точки потока данных.

  • Передавайте stdout одной команды в stdin другой через конвейер.

  • При необходимости перенаправляйте stderr отдельно.

  • Копируйте ввод одновременно в файл и stdout с помощью tee.

  • Добавляйте данные командой tee -a, не заменяя файл.

  • Осознанно размещайте tee до или после фильтра.

Сохраните прогресс

Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.

Создать бесплатный аккаунт
Следующий Урок
Назад к Text-Fu