Введение
Философия Linux построена на парадигме «одна утилита для одной функции». Из этого вытекает тот факт, что в современных дистрибутивах Linux огромное множество различных утилит, каждая из которых обладает только необходимым минимумом функций, зато то, что она делает, делается хорошо.
Второй вывод из указанных принципов – настоятельная необходимость реализации возможности «передавать» результаты работы из одной программы в другую «внутри» операционной системы.
И такой механизм был найден. В Linux им стал механизм «потоков». Все процессы работают в рамках трех потоков – стандартный ввод (stdin), стандартный вывод (stdout) и стандартная ошибка (stderr). Под эти потоки системно зарезервирована нумерация – «0» для stdin, «1» для stdout и «2» для stderr.
Стандартный поток ввода принимает данные с клавиатуры или с потока вывода другого скрипта. Примеры рассмотрим ниже в данной статье.
По умолчанию поток stdout выводит данные на терминал пользователя.
Вывод stderr (стандартный вывод для ошибок) также показывает свои данные на экране терминала, но с одним отличием – он используется только если «что-то пошло не так», в случае штатного поведения программы ее вывод направляется на stdout.
Перенаправление потоков
Вывод данных с любого из трех описанных потоков можно перенаправить в другой поток или в файл. Для этого зарезервированы спецсимволы перенаправления (< и >).
Двойное перенаправление дописывает данные с вывода к данным целевого объекта
Одинарный символ перенаправления заменяет содержимое целевого объекта на перенаправляемый вывод.
Пайп-символы
Помимо перенаправления данных стандартных потоков ввода-вывод, в Linux реализована «передача» данных вывода одной программы на поток ввода другой программы. Для этого зарезервирован т.н. «пайп-символ», вертикальная черта (|). Например, в команде
history | grep touch
сначала на поток вывода передается история команд пользователя, затем эти данные передаются на вход утилите grep, которая отфильтровывает только те команды, что содержат слово «touch» и уже эти данные отображаются в терминале пользователя.
Программы-фильтры
Это целый класс утилит, которые используются совместно с «пайп-символом» и служат для «выборки» данных. Наиболее популярные программы-фильтры:
- find – используется для поиска файлов по имени
- grep – отображает «отфильтрованный» текст, содержащий только те строки, в которых встречаются данные, поданные программе в качестве аргумента
- tee – утилита «перенаправляет» входящий поток данных одному или нескольким «целевым» объектам. Это могут быть файлы, другие программы, потоки ввода-вывода итп
- tr – используется для поиска и замены текста
- wc – подсчитывает сколько раз заданные в качестве аргумента символы встречаются в содержимом «целевого» объекта
Выводы
Резюмируя можно сказать, что понимание механизма потоков и работы системных перенаправлений крайне важно. Это безусловно поможет при создании программ, обслуживании серверов, или автоматизации рутинных процессов любого вида.