locate(1) буферизует свой вывод

locate(1) буферизует свой вывод

Я использую locate(1)GNU findutils для небольшой задачи, и похоже, что он буферизует свой вывод. Я передаю вывод locate в другую задачу, которая будет обрабатывать строки по мере их нахождения locate. Поскольку выполнение locate может занять много времени, я думал, что locate будет выводить файлы по мере их нахождения, но похоже, что locate буферизует вывод.

Если я запускаю locate на TTY, он немедленно выводит первое совпадение и тратит около 10 секунд на поиск остальных совпадений.

Если вместо этого я запущу locate, но перейду на cat, то ничего не увижу, пока вся команда не будет выполнена.

Похоже, locate буферизует вывод и не имеет возможности отключить его.

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

locate something | xargs -n 1 do_something

Но происходит следующее: xargs и, следовательно, do_something не вызываются до тех пор, пока find не завершится.

решение1

Конечно, я нашел ответ сразу после публикации, впост, предложенный stackexchange при публикации.

unbuffer(из ожидаемого) решает эту проблему.

unbuffer locate something | xargs -n 1 do_something

выполняет команды так быстро, как только locate их находит.

решение2

locateбуферизует поток STDOUT, необходимо сделать STDOUT locateнебуферизованным (или построчно буферизованным).

Если вы используете систему GNU, вы можете использовать stdbuf(входит в состав GNU coreutils).

Чтобы сделать STDOUT locateнебуферизованным:

stdbuf -o0 locate something | ...

Линия буферизована:

stdbuf -oL locate something | ...

Проверьте man stdbuf, чтобы получить больше информации.

Связанный контент