Как сделать вывод любой команды оболочки небуферизованным? - PullRequest
56 голосов
/ 12 августа 2010

Есть ли способ запуска команд оболочки без буферизации вывода?

Например, hexdump file | ./my_script будет передавать входные данные из hexdump в my_script только в буферизованных блоках, а не построчно.

На самом деле я хочу знать общее решение, как сделать любую команду небуферизованной?

Ответы [ 4 ]

112 голосов
/ 28 августа 2014

Попробуйте stdbuf, включенный в GNU coreutils и, следовательно, практически любой дистрибутив Linux Это устанавливает длину буфера для ввода, вывода и ошибки в ноль:

stdbuf -i0 -o0 -e0 command
31 голосов
/ 12 августа 2010

Команда unbuffer из пакета expect отключает буферизацию вывода:
Ubuntu Manpage: unbuffer - вывод небуфера

Пример использования:

unbuffer hexdump file | ./my_script
19 голосов
/ 12 августа 2010

AFAIK, вы не можете сделать это без уродливых хаков.Запись в канал (или чтение из него) автоматически включает полную буферизацию, и вы ничего не можете с этим поделать :-(. «Строковая буферизация» (это то, что вам нужно) используется только при чтении / записи терминала.Уродливые хаки именно так и делают: они подключают программу к псевдотерминалу, чтобы другие инструменты в конвейере считывали / записывали с этого терминала в режиме буферизации строк. Вся проблема описана здесь:

На странице также есть несколько предложений (вышеупомянутые "уродливые хаки"), что делать, то есть использовать unbuffer или использовать некоторые трюки с помощью LD_PRELOAD.

18 голосов
/ 07 мая 2013

Вы также можете использовать команду script, чтобы сделать вывод hexdump с линейной буферизацией (hexdump будет запущен в псевдотерминале, который обманывает hexdump, заставляя думать, что он выводит свой стандартный вывод на терминал, и не в трубу).

# cf. http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe/
stty -echo -onlcr
script -q /dev/null hexdump file | ./my_script         # FreeBSD, Mac OS X
script -q -c "hexdump file" /dev/null | ./my_script    # Linux
stty echo onlcr
...