Как съесть один пирог дважды: bash, tee, process substitution


ams - Posted on 20 Ноябрь 2008

Задача проста: обработать один стандартный ввод с помощью двух (или более) фильтров.

Тривиальное решение: сохранить ввод в файл и потом его дважды обработать.

$ some_cmd > tmp_file; filtr1 < tmp_file; filtr2 < tmp_file; rm tmp_file

Существует однако полезная программа tee, которая умеет свой стандартный ввод записывать в много разных мест. Вот бы взять да и отослать результат не в разные файлы, а послать на вход разным процессам! Если в bash разрешена такая штука как process substitution, то это вполне возможно.

Пример: выведем список юзеров, у которых логин-шелл установлен в /bin/bash, а также число таких юзеров.

$ grep /bin/bash /etc/passwd | tee >(wc -l)

Здесь мы составили нужный список с помощью grep, размножили его с помощью tee и одну из копий подали на вход команде wc -l, которая сосчитает количество строк. Пример, конечно, игрушечный, но общая идея должна быть ясна :)

0
Ваша оценка: Ничего

ссылка в тему http://linsovet.com/gcc-flags-O-diff
был еще совет где мы разбирались что такое <()

так же можно через именованые пайпы (mkfifo) и неименованые.

во freebsd <() как раз и использует для этого дела именованые пайпы, а под линуксом /proc/PID/fs/номер

пайпы, конечно, можно, но тут как раз премущество в том, что не надо вручную делать эти телодвижения.

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.