Как сделать вывод любой команды оболочки без буфера?
Есть ли способ запуска команд оболочки без буферизации вывода?
Например, hexdump file | ./my_script
будет передавать входные данные из hexdump в my_script в буферизованные куски, а не по строкам.
На самом деле, я хочу знать общее решение, как сделать любую команду небуферизованной?
Ответы
Ответ 1
AFAIK, вы не можете сделать это без уродливых хаков. Запись в трубу (или чтение из нее) автоматически включает полную буферизацию, и вы ничего не можете с ней поделать:-( "Буферизация строк" (именно это вы хотите) используется только при чтении/записи терминала. уродливые хаки именно так: они подключают программу к псевдотерминалу, так что другие инструменты в трубе читают/записывают с этого терминала в режиме буферизации строк. Вся проблема описана здесь:
На странице также есть некоторые предложения (вышеупомянутые "уродливые хаки" ), что делать, т.е. используя unbuffer
или вытягивая некоторые трюки с помощью LD_PRELOAD
.
Ответ 2
Попробуйте stdbuf
, включенный в GNU coreutils и, следовательно, практически любой дистрибутив Linux. Это устанавливает длину буфера для ввода, вывода и ошибки в ноль:
stdbuf -i0 -o0 -e0 command
Ответ 3
Команда unbuffer
из пакета expect
отключает выходную буферизацию:
Ubuntu Manpage: unbuffer - вывод буферов
Пример использования:
unbuffer hexdump file | ./my_script
Ответ 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