26.08.2022

Стандартные перенаправления ввода-вывода в Linux

Введение

Философия Linux построена на парадигме «одна утилита для одной функции». Из этого вытекает тот факт, что в современных дистрибутивах Linux огромное множество различных утилит, каждая из которых обладает только необходимым минимумом функций, зато то, что она делает, делается хорошо.

Второй вывод из указанных принципов – настоятельная необходимость реализации возможности «передавать» результаты работы из одной программы в другую «внутри» операционной системы.

И такой механизм был найден. В Linux им стал механизм «потоков». Все процессы работают в рамках трех потоков – стандартный ввод (stdin), стандартный вывод (stdout) и стандартная ошибка (stderr).  Под эти потоки системно зарезервирована нумерация – «0» для stdin, «1» для stdout и «2» для stderr.

Стандартный поток ввода принимает данные с клавиатуры или с потока вывода другого скрипта. Примеры рассмотрим ниже в данной статье.

По умолчанию поток stdout выводит данные на терминал пользователя.

Вывод stderr (стандартный вывод для ошибок) также показывает свои данные на экране терминала, но с одним отличием – он используется только если «что-то пошло не так», в случае штатного поведения программы ее вывод направляется на stdout.

Перенаправление потоков

Вывод данных с любого из трех описанных потоков можно перенаправить в другой поток или в файл. Для этого зарезервированы спецсимволы перенаправления (< и >).

Двойное перенаправление дописывает данные с вывода к данным целевого объекта

Одинарный символ перенаправления заменяет содержимое целевого объекта на перенаправляемый вывод.

Пайп-символы

Помимо перенаправления данных стандартных потоков ввода-вывод, в Linux реализована «передача» данных вывода одной программы на поток ввода другой программы. Для этого зарезервирован т.н. «пайп-символ», вертикальная черта (|). Например, в команде

history | grep touch

 сначала на поток вывода передается история команд пользователя, затем эти данные передаются на вход утилите grep, которая отфильтровывает только те команды, что содержат слово «touch» и уже эти данные отображаются в терминале пользователя.

Программы-фильтры

Это целый класс утилит, которые используются совместно с «пайп-символом» и служат для «выборки» данных. Наиболее популярные программы-фильтры:

Выводы

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