Как съесть один пирог дважды: bash, tee, process substitution
Задача проста: обработать один стандартный ввод с помощью двух (или более) фильтров.
Тривиальное решение: сохранить ввод в файл и потом его дважды обработать.
$ 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, которая сосчитает количество строк. Пример, конечно, игрушечный, но общая идея должна быть ясна :)
- 3102 просмотра
Страница для печати

ссылка в тему http://linsovet.com/gcc-flags-O-diff
был еще совет где мы разбирались что такое <()
так же можно через именованые пайпы (mkfifo) и неименованые.
во freebsd <() как раз и использует для этого дела именованые пайпы, а под линуксом /proc/PID/fs/номер
пайпы, конечно, можно, но тут как раз премущество в том, что не надо вручную делать эти телодвижения.
во http://linsovet.com/node/798
Отправить комментарий