Привет, сегодня продолжение небольшой заметки по командной строке. Начало здесь. Сегодня про конвеер∕пайплайн, управление потоками и немного о том как их скрещивать.
При старте любой программы операционная система связывает с ней 3 потока:
- Входящие данные (Standart input, STDIN)
- Выходные данные (Standart output, STDOUT)
- Данные об ошибках (Standart error, STDERR)
Для языка программирования эти потоки - просто файлы. Операционная система сама решит куда вывести результат и как в дальнейшем взаимодействовать с этими данными.
У потоков есть свои номера:
- STDIN -> 0
- STDOUT -> 1
- STDERR -> 2
Зная это можно манипулировать данными и перенаправлять потоки. Например мы можем собрать ошибки в файл и вести своеобразный лог:
$ cd some_nonexistent_dir > output 2>&1
2>&1 позволяет перенаправить поток, отвечающий за ошибки в вывод и сохранить это все в файл output. При этом можно перенаправить в файл сразу оба потока с помощью &>some_file.
символ > позволяет перезаписать данные.
символ >> позволяет добавить данные в конец файла. Если заменить > на >> второй раз использовать команду, то в файле уже будет не одна запись а две.
символ < позволяет перенаправить данные из файла в STDIN команды.
Это все поможет, понять как работает конвеер (PIPELINE).
Конвеер∕пайплайн позволяет протаскивать данные через цепочки команд.
Команды соединяются с помощью символа `|`. Выход данных одной команды подается на вход в другую. Так вы сможете разбить исполнение одной сложной программы на N простых операций, которыми будет гораздо проще управлять.
Один из самый простых примеров, который я периодически использую - поиск как-либо команды, которую уже использовал в терминале, но делал это достаточно давно, чтобы просто проматывать последние подключения.
history | grep ssh | tail -n5
Порядок выполнения такой: history читает информацию из файла с историей команд, введенных в терминал и передает её в grep, которая находит все строки, в которых использовалась команда подключения по ssh. Найденные данные уходят в tail, которая ограничивает вывод 5 строками.
За построением пайплайнов кроется несколько достаточно глубоких идей:
- Пишите программы, которые будут делать что-то одно и делать это хорошо.
- Пишите программы, которые будут работать вместе.
- Пишите программы, которые поддерживают текстовые потоки, т.к. это универсальный интерфейс.
На этом на сегодня всё) Последнее время поковыриваю питоновские кишки, в следующей заметке скорее всего будет перевод заметки о работе сборщика мусора. Будем разбираться как в Python считаются ссылки и когда он выкидывает объекты из памяти.