Конвейеры и фильтры
Конвейер (pipe) позволяет направить поток вывода одного процесса на поток ввода другого процесса. Для организации конвейера необходимо поставить символ конвейера — вертикальную черту (|) между командами, потоки ко- торых необходимо объединить. Естественно, первой должна быть указана команда, поток вывода которой должен быть передан второй команде (при- мер 8.11).
Пример 8.11. Конвейер |
$ last | view -
Выводимый командой last список входивших в сеанс пользователей передан через конвейер команде просмотра view (вызов vi на чтение, нажмите :q для выхода). Знак "дефис" после команды view сообщает, что текст должен быть получен из потока ввода, в который передает свой вывод команда last.
Конвейер может состоять из множества команд, причем команды в середине конвейера обязательно должны быть фильтрами. Фильтр — это команда,
способная принимать поток данных через стандартный поток ввода, обраба- тывать их и выводить обработанные данные в стандартный поток вывода.
Правила построения конвейера таковы:
1. Первая команда конвейера должна выводить информацию в поток вывода.
2. Команды, не находящиеся по краям конвейера, должны быть фильтрами.
3. Последняя команда в конвейере должна читать стандартный поток ввода.
Пример фильтра — команда tee. Она никак не меняет полученные из стан- дартного потока ввода данные, а лишь копирует их в стандартный поток вы- вода и в файлы, заданные ей в качестве аргументов (пример 8.12).
Пример 8.12. Команда tee |
$ ps -o comm= | -o pid= | tee ps.txt | sort | |
bash | ||
ps | ||
sort | ||
tee | ||
$ cat | ps.txt | |
ps | ||
tee | ||
sort | ||
bash |
В примере 8.12 команда ps выводит список процессов без заголовка в два столбца: команда и PID. Содержимое файла ps.txt содержит вывод команды ps, т. к. команда tee получила его из стандартного потока ввода. Эти же дан- ные tee передала через поток вывода далее команде sort для сортировки. На экран выводится сортированный список процессов, а в файле ps.txt — он не отсортированный.
Команду tee часто используют для отладки работы сложных конвейеров, состоящих из множества команд. Эту команду удобно устанавливать в месте конвейера, которое вызывает подозрения. Так как в файле, указанном в каче- стве аргумента tee, будет находиться та же информация, что была передана в данном месте конвейера, то по ней легко можно будет определить наличие и суть ошибок.
Большинство фильтров предназначено для обработки исключительно текста, но это вовсе не обязательно. Команда tee, например, может обрабатывать и бинарные данные. При этом стоит позаботиться лишь о том, чтобы бинарные
данные не были выведены на экран, например, перенаправив поток вывода в /dev/null.
Дата добавления: 2015-06-12; просмотров: 1089;