
Помню, как где-то читал (потом забыл где) о редко используемом типе bash pipe, который мог перенаправлять вывод построчно. Другими словами, вместо того, чтобы перенаправлять вывод один раз в конце, вывод перенаправлялся бы для каждой новой строки и запускал бы процесс получения несколько раз. Я просмотрел все документы bash, которые смог достать, но не могу понять, существует ли этот 'pipe' на самом деле.
Существует ли такая вещь, как конвейер построчно? Конечно, эту задачу можно было бы легко выполнить другими способами, но мне интересно, есть ли более элегантный способ.
решение1
Я думаю, вы ищете xargs? Допустим, я хочу найти все файлы .bak в каталоге и удалить их.
find . -name "*.bak" -type f -print | xargs /bin/rm -f
Для каждого найденного файла он передает результат по конвейеру и удаляет файл.
http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/
решение2
Я думаю, вы думаете об инструменте unbuffer
. Вы можете использовать его для отключения буферизации, которая происходит, когда вывод отправляется из одной команды в другую через канал.
При использовании такой команды вы не увидите никаких выходных данных, пока не будет буферизовано определенное количество страниц:
$ od -c /tmp/fifo | more
Вы можете отключить эту автоматическую буферизацию следующим образом:
$ unbuffer od -c /tmp/fifo | more
Обычно unbuffer не читает из STDIN. Это упрощает использование unbuffer
в некоторых ситуациях. Для использования unbuffer
в конвейере используйте флаг -p.
$ process1 | unbuffer -p process2 | process3