Потоки (STDIN, STDOUT и STDERR)

В каждом языке есть собственный способ напечатать результат на экран.

При старте любой программы операционная система связывает с ней три так называемых потока: STDIN (Standard Input), STDOUT (Standard Output) и STDERR (Standard Error). Для языка программирования они выглядят как файлы, и взаимодействие с ними происходит как с файлами.

Стандартные потоки ввода-вывода в системах типа UNIX — потоки процесса, имеющие номер (дескриптор), зарезервированный для выполнения некоторых «стандартных» функций. Как правило (хотя и не обязательно), эти дескрипторы открыты уже в момент запуска задачи (исполняемого файла).

STDOUT: отвечает за вывод на экран

Например, вывод любой команды, запущенной в bash, можно записать в файл вместо вывода на экран:

$ ls -la > output 

Запустив эту команду, вы увидите, что на экране ничего не отобразилось, но в текущей директории появился файл output. Операция, которую мы сделали выше, называется перенаправление потоков. Символ > означает, что нужно взять вывод из команды, указанной слева, и отправить его в файл, указанный справа. > всегда перезаписывает файл. Если нужно не перезаписывать, а добавлять, то используйте >>.

STDIN: через него программа может получать данные на вход

В nix-системах встроена утилита wc (word count — "количество слов"), которая умеет считать количество слов, строк или символов в файле. Когда мы говорим о файле, то в nix это почти всегда означает, что данные можно передать и в стандартный поток ввода.

// Флаг l (буква l, а не  цифра 1) говорит о том, что надо считать количество строк
$ wc -l < result
2

Выглядит довольно логично — стрелка меняет своё направление в другую сторону и содержимое файла отправляется в STDIN запускаемой программы wc.

Теперь сделаем финт и объединим перенаправление ввода и вывода.

$ wc -l < result > output
$ cat output
$ 2

STDERR

Позволяет отделить нормальный вывод программы от возникающих ошибок. Такой подход удобен при ведении логов, для реагирования и отладки.

Пайплайн (Конвейер)

Раз у одного процесса есть вход, а у другого — выход, и их можно подменять, то логично предположить, что их можно соединить. Данный подход носит название pipeline (конвейер). Благодаря пайплайну можно соединять программы и протаскивать данные сквозь них, как сквозь цепочку функций, каждая из которых выступает в роли преобразователя или фильтра.

| — этот символ называется пайп, он указывает шеллу взять STDOUT одного процесса и соединяет его с STDIN другого процесса.

$ cat source | grep Dog | uniq | sort
// 1 Читается файл source
// 2 Входные данные грепаются по подстроке "Dog"
// 3 Убираются дубли (в исходном файле две одинаковых строки "Dog")
// 4 Входные данные сортируются и выводятся на экран

Пайплайн стал основой философии Unix, которая звучит так:

  1. Пишите программы, которые делают что-то одно и делают это хорошо.
  2. Пишите программы, которые бы работали вместе.
  3. Пишите программы, которые бы поддерживали текстовые потоки, поскольку это универсальный интерфейс.

Подробно здесь -> ru.wikipedia.org

openImgPic