Конвейеры соединяют небольшие команды, позволяя данным проходить между ними без промежуточного файла. Команда tee может сохранить копию части такого потока в файл и одновременно передать данные дальше.
Text-Fu · Урок 4
Конвейер и 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"
Этот конвейер:
- Формирует полный подробный список.
- Сохраняет весь поток в
etc-listing.txt. - Передаёт тот же поток в
grep, который выводит только строки сconf.
Файл содержит данные до фильтрации командой grep. Если в файл нужны только отфильтрованные строки, поместите tee после grep.
Что будет содержать all.txt после успешного выполнения produce | tee all.txt | grep error?
Чтобы попрактиковаться с конвейерами и копированием потоков, выполните лабораторные работы:
- Перенаправление ввода и вывода в Linux — потренируйтесь управлять stdout, stderr и stdin с помощью операторов
>,>>,2>и командыtee. - Управление последовательностью и конвейеры — научитесь управлять последовательностями команд, использовать конвейеры и инструменты обработки текста
cut,grep,wc,sortиuniq. - Перенаправление потоков данных — освойте управление стандартными потоками ввода, вывода и ошибок, объединение вывода и применение
/dev/null.
Урок завершён
Вы завершили Конвейер и tee
Теперь вы можете соединять команды и сохранять выбранные точки потока данных.
Передавайте stdout одной команды в stdin другой через конвейер.
При необходимости перенаправляйте stderr отдельно.
Копируйте ввод одновременно в файл и stdout с помощью
tee.Добавляйте данные командой
tee -a, не заменяя файл.Осознанно размещайте
teeдо или после фильтра.
Сохраните прогресс
Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.
Создать бесплатный аккаунт