0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Вы уже знаете, что у одного процесса есть вход, а у другого - выход. При этом их можно подменять. Логично предположить, что их можно и соединить. Этот подход носит название<strong>пайплайн</strong>(от англ.<em>pipeline</em>). Именно пайплайнам мы уделим внимание в этом уроке.</p>
1
<p>Вы уже знаете, что у одного процесса есть вход, а у другого - выход. При этом их можно подменять. Логично предположить, что их можно и соединить. Этот подход носит название<strong>пайплайн</strong>(от англ.<em>pipeline</em>). Именно пайплайнам мы уделим внимание в этом уроке.</p>
2
<p>Благодаря пайплайну можно соединять программы и протаскивать данные сквозь них. Получается цепочка функций, в которой каждое звено выступает в роли преобразователя или фильтра.</p>
2
<p>Благодаря пайплайну можно соединять программы и протаскивать данные сквозь них. Получается цепочка функций, в которой каждое звено выступает в роли преобразователя или фильтра.</p>
3
<p>Когда мы учились грепать, то делали это по какому-то одному слову. Но часто возникает задача погрепать по нескольким словам. Не важно, как они расположены внутри строки, главное, что они встречаются там вместе.</p>
3
<p>Когда мы учились грепать, то делали это по какому-то одному слову. Но часто возникает задача погрепать по нескольким словам. Не важно, как они расположены внутри строки, главное, что они встречаются там вместе.</p>
4
<p>Такую функциональность можно было бы сделать, усложнив саму программу grep. Но пайплайн позволяет добиться такого же поведения без необходимости писать сложную программу:</p>
4
<p>Такую функциональность можно было бы сделать, усложнив саму программу grep. Но пайплайн позволяет добиться такого же поведения без необходимости писать сложную программу:</p>
5
<p>Обратите внимание на | - этот символ называется<strong>пайп</strong>. Он указывает, что командная оболочка должна взять поток STDOUT одного процесса и соединить его с потоком STDIN другого процесса.</p>
5
<p>Обратите внимание на | - этот символ называется<strong>пайп</strong>. Он указывает, что командная оболочка должна взять поток STDOUT одного процесса и соединить его с потоком STDIN другого процесса.</p>
6
<p>Все утилиты, которые читают файлы, могут принимать данные через поток STDIN. Поскольку утилита grep принимает на вход и возвращает текст, то его можно комбинировать бесконечно:</p>
6
<p>Все утилиты, которые читают файлы, могут принимать данные через поток STDIN. Поскольку утилита grep принимает на вход и возвращает текст, то его можно комбинировать бесконечно:</p>
7
<p>Запись grep PATH .profile | grep local можно изменить, используя перенаправление. Так она станет проще для модификации:</p>
7
<p>Запись grep PATH .profile | grep local можно изменить, используя перенаправление. Так она станет проще для модификации:</p>
8
<p>В примере выше файл читается катом и отправляется в поток STDIN грепа.</p>
8
<p>В примере выше файл читается катом и отправляется в поток STDIN грепа.</p>
9
<p>Еще один пример:</p>
9
<p>Еще один пример:</p>
10
<p>Посмотрим, как этот пример работает по шагам:</p>
10
<p>Посмотрим, как этот пример работает по шагам:</p>
11
<ol><li>Читается файл<em>source</em></li>
11
<ol><li>Читается файл<em>source</em></li>
12
<li>Грепаются входные данные по подстроке Dog</li>
12
<li>Грепаются входные данные по подстроке Dog</li>
13
<li>Убираются дубли (в исходном файле две одинаковых строки Dog)</li>
13
<li>Убираются дубли (в исходном файле две одинаковых строки Dog)</li>
14
<li>Сортируются входные данные и выводятся на экран</li>
14
<li>Сортируются входные данные и выводятся на экран</li>
15
</ol><p>Пайплайн стал основой философии Unix, которая звучит так:</p>
15
</ol><p>Пайплайн стал основой философии Unix, которая звучит так:</p>
16
<ul><li>Пишите программы, которые делают что-то одно и делают это хорошо</li>
16
<ul><li>Пишите программы, которые делают что-то одно и делают это хорошо</li>
17
<li>Пишите программы, которые бы работали вместе</li>
17
<li>Пишите программы, которые бы работали вместе</li>
18
<li>Пишите программы, которые бы поддерживали текстовые потоки, поскольку это универсальный интерфейс</li>
18
<li>Пишите программы, которые бы поддерживали текстовые потоки, поскольку это универсальный интерфейс</li>
19
</ul><p>Именно поэтому большинство утилит работают с сырым текстом - принимают его на вход и возвращают в поток STDOUT.</p>
19
</ul><p>Именно поэтому большинство утилит работают с сырым текстом - принимают его на вход и возвращают в поток STDOUT.</p>
20
<p>Такой подход позволяет получать сложное поведение из крайне простых составных блоков. Такая концепция называется<strong>стандартные интерфейсы</strong>и хорошо отражена в конструкторах Lego.</p>
20
<p>Такой подход позволяет получать сложное поведение из крайне простых составных блоков. Такая концепция называется<strong>стандартные интерфейсы</strong>и хорошо отражена в конструкторах Lego.</p>