Потоки (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, которая звучит так:
- Пишите программы, которые делают что-то одно и делают это хорошо.
- Пишите программы, которые бы работали вместе.
- Пишите программы, которые бы поддерживали текстовые потоки, поскольку это универсальный интерфейс.
Подробно здесь -> ru.wikipedia.org