HTML Diff
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>