Линейный буферизированный кот

есть ли способ сделать line-buffer cat? Например, я хочу наблюдать за устройством UART, и я хочу видеть его сообщение только тогда, когда есть целая строка. Могу ли я сделать что-то вроде:

cat --line-buffered /dev/crbif0rb0c0ttyS0

Спасибо.


person Jinghao Shi    schedule 04.05.2012    source источник


Ответы (3)


Нет, но GNU grep с --line-buffered может это сделать. Просто найдите что-то, что есть в каждой строке, например '^'.

person Ignacio Vazquez-Abrams    schedule 04.05.2012
comment
Пробовал cat /dev/crbif0rb0c0ttyS0 | grep . --line-buffered, но печатаются только пустые строки. Если подставлю UART-устройство на обычный файл, то все ок. Любые идеи по этому поводу? - person Jinghao Shi; 04.05.2012
comment
О, я попробовал cat /dev/crbif0rb0c0ttyS0 | grep ^ --line-buffered, и это работает! Хотя не знаю почему... - person Jinghao Shi; 04.05.2012
comment
Это работает, но вы можете объяснить? вывод cat должен быть буферизован, так как он подключен к каналу. Итак, как команда grep --line-buffered приводит к сбросу буфера cat, чтобы grep работал как линейная буферизация? - person Vassilis; 06.10.2012
comment
вывод cat должен быть буферизован, так как он подключен к каналу. [нужна цитата] - person Ignacio Vazquez-Abrams; 06.10.2012
comment
Я столкнулся с этим, проводя небольшое исследование буферов stdio. Существует эта статья, и я во многих ситуациях упоминаю, что .. .Притворяясь терминалом, буферизация стандартного вывода автоматически устанавливается в «построчный режим», в противном случае он устанавливается в буферизованный (обычно 4 КБ)...». Однако я не уверен, поэтому, если бы вы могли дать техническую справку о поведении буферизации stdout, stdin и т. д. вместе с каналами, это было бы очень полезно. Спасибо... - person Vassilis; 06.10.2012

Вы также можете использовать bash в своих интересах здесь:

cat /dev/crbif0rb0c0ttyS0 | while read line; do echo $line; done

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

person Greyson    schedule 04.05.2012
comment
Нет необходимости в cat, если вы используете этот метод. - person Ignacio Vazquez-Abrams; 04.05.2012

Пропустите его через perl в режиме буферизации строк:

perl -pe 1 /dev/whatever
person bdonlan    schedule 04.05.2012