Как работают трубы и бесконечные потоки?

Я бы использовал nawk :

nawk "BEGIN{print srand}"
4
19.05.2016, 08:36
3 ответа

Каналы соединяют выход или левую команду со входом правой команды. Это не имеет ничего общего с длиной потока. Однако каждая команда в конвейере по-прежнему имеет собственные правила буферизации. Если вы не запускаете их в каждой команде, вы не увидите их в окончательном выводе.

5
27.01.2020, 20:47

Это в основном дубликат моего ответа на SO . Однако, поскольку никто не упомянул здесь команду stdbuf , я решил, что должен добавить и ее сюда.

===============

В основном процесс, который читает из конвейера, может потреблять данные побайтно, как только они становятся доступными в конвейере. Однако, пока программы используют функции std io библиотеки libc, такие как чтение, запись и т. Д., Libc будет буферизовать ввод / вывод этих программ в зависимости от того, выполняет ли программа запись на терминал или нет.

По умолчанию, если программа выполняет запись на терминал, libc будет буферизовать вывод по строке, если он не переходит на терминал, она получает блочную буферизацию.

В Linux, имея glibc, вы можете повлиять на это поведение с помощью команды stdbuf , например так:

stdbuf -oL cat | stdbuf -ioL sed '' | stdbuf -iL sed ''

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

4
27.01.2020, 20:47

Вы можете использовать -u опцию sed для минимизации буферизации:

cat | sed -u '' | sed ''
3
27.01.2020, 20:47

Теги

Похожие вопросы