Как сделать вывод любой команды оболочки без буфера?

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

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

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

Ответ 1

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

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

Ответ 2

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

stdbuf -i0 -o0 -e0 command

Ответ 4

Вы также можете использовать команду script, чтобы сделать вывод hexdump line-buffered (hexdump будет запущен в псевдотерминале, трюки hexdump, чтобы подумать о том, что он записывает его stdout на терминал, и не к трубе).

# cf. http://unix.stackexchange.com/info/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