Использование состыкованных команд (конвейер)

Выше уже демонстрировалось, как использовать программу sort в качестве фильтра. В этих примерах предполагалось, что исходные данные находятся в некотором файле или что эти исходные данные будут введены с клавиатуры (стандартного ввода). Однако как поступить, если Вы хотите отсортировать данные, которые являются результатом работы какой-либо другой команды, например, ls?

Будем сортировать данные в обратном алфавитном порядке, это делается опцией -r команды sort. Если Вы хотите перечислить файлы в текущем каталоге в обратном алфавитном порядке, один из способов сделать это будет таким. Применим сначала команду ls:

$ ls /bin

arch

awk

basename

bash

....

$

Теперь перенаправляем выход команды ls в файл с именем file-list:

$ ls /bin > file-list

$ sort -r file-list

zcat

ypdomainname

xargs

wc

...

$

Здесь выход команды ls был сохранён в файле, а после этого файл был обработан командой sort -r. Однако этот путь является неизящным и требует использования временного файла для хранения выходных данных программы ls.

Решением в данной ситуации может служить создание состыкованных команд (англ. pipelines). Стыковку осуществляет командная оболочка, которая stdout первой команды направляет на stdin второй команды. В данном случае мы хотим направить stdout команды ls на stdin команды sort. Для стыковки используется символ | (вертикальная черта), как это показано в следующем примере:

$ ls /bin | sort -r

zcat

ypdomainname

xargs

wc

...

$

Эта команда короче, чем совокупность команд, и её проще набирать.

Рассмотрим другой полезный пример. Команда

$ ls /usr/bin

выдаёт длинный список файлов. Большая часть этого списка выводится на экран слишком быстро, чтобы его содержимое можно было прочитать. Попробуем использовать команду more для того, чтобы выводить этот список частями:

$ ls /usr/bin | more

Теперь можно этот список «перелистывать».

Можно пойти дальше и состыковать более двух команд. Рассмотрим команду head, которая является фильтром, выводящим первые строки из входного потока (в нашем случае на вход будет подан выход от нескольких состыкованных команд). Если мы хотим вывести на экран последнее по алфавиту имя файла в текущем каталоге, можно использовать следующую длинную команду:

$ ls | sort -r | head -1 notes

$

где команда head -1 выводит на экран первую строку получаемого ей входного потока строк (в нашем случае поток состоит из данных от команды ls), отсортированных в обратном алфавитном порядке.

Фильтры не обязательно используются только для обработки текста. Например, в пакете netpbm содержатся утилиты для обработки изображений, которые тоже являтся фильтрами. Для увеличения иконки Midnight Commander в 5 раз и преобразования её из формата PNG в JPEG можно использовать такую связку команд:

$ pngtopnm /usr/share/icons/mc.png | pnmenlarge 5 | pnmsmooth | pnmtojpeg > /tmp/mc.jpg

Здесь pngtopnm читает файл иконки (/usr/share/icons/mc.png)
в формате PNG, преобразует его в формат PNM и выдаёт результат в стандартный вывод. pnmenlarge принимает файл в формате PNM из стандартного ввода, увеличивает (масштабирует) картинку в 5 раз и выдаёт результат в стандартный вывод. Далее pnmsmooth выполняет операцию сглаживания, а pnmtojpeg преобразует поток данных в формат JPEG. Итоговый результат pnmtojpeg также выдаёт на стандартный выход, который средствами командного интерпретатора перенаправляется в файл /tmp/mc.jpg.

Другой пример: утилита mkisofs создаёт для файлов из заданного ей в качестве параметра каталога образ диска с файловой системой ISO9660 для записи на оптические диски. А утилита cdrecord умеет записывать такие образы непосредственно на сами диски. Утилиты могут использоваться по-отдельности, с записью образа файловой системы в файл и последующей записью такого файла на диск. Однако их можно объединить в единую связку и записывать диски без создания временных файлов:

$ mkisofs ~/mydisk | cdrecord -

Здесь для того, чтобы приказать cdrecord использовать данные со стандартного входа, а не читать их из файла, мы в качестве имени файла указали - (дефис).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: