7

Этот первый конвейер работает нормально (печать "с"):

echo "a" | sed 's/a/b/' | sed 's/b/c/'

Этот не делает то, что я ожидаю (ничего не печатается, когда я подаю "а" в моем fifo):

mkfifo fifo;
cat fifo | sed 's/a/b/' | sed 's/b/c/' 

Однако, если я удаляю вторую команду "sed" из последнего конвейера, я получаю "b". Я думаю, что мое понимание каналов и перенаправлений должно быть слишком упрощенным. Может кто-нибудь объяснить мне, как исправить второй случай, чтобы я мог запустить две последовательные команды для содержимого fifo?

(обратите внимание, что это не проблема, специфичная для fifo, то же самое происходит и с netcat). Я написал аналогичный вопрос о netcat, но не получил ответов)

1 ответ1

8

Используйте опцию -u (--unbuffered) sed, чтобы она записывала свой вывод, вместо того, чтобы сначала собирать его для быстрой, большой записи позже.

cat fifo | sed -u 's/a/b/' | sed -u 's/b/c/'

cat всегда небуферизована.

Если это не про sed но некоторые программы с буферизацией вывода, но без параметров , чтобы вывести его из строя, есть инструменты , которые могут помочь заставить буферизацию от - видеть man unbuffer и man stdbuf

Если это сценарий оболочки, по умолчанию он должен быть небуферизован: когда команда создает выходные данные в сценарии и завершается, выходные данные сбрасываются. В противном случае вы используете unbuffer внутри сценария оболочки.

Для справки, смотрите этот обзор буферизации stdio.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .