Найти тему

Работа с linux. Пайплайны

Привет, сегодня продолжение небольшой заметки по командной строке. Начало здесь. Сегодня про конвеер∕пайплайн, управление потоками и немного о том как их скрещивать.

Да, да, мы помним.
Да, да, мы помним.

При старте любой программы операционная система связывает с ней 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 считаются ссылки и когда он выкидывает объекты из памяти.