Bash выходной поток записи в файл - PullRequest
4 голосов
/ 17 марта 2012

так что я запускаю это на bash:

# somedevice -getevent

Что делает эта команда, так это то, что она просто продолжает работать, и каждый раз, когда мое устройство отправляет определенные данные, скажем, оно обнаруживает изменение температуры, оно выдает что-то вроде этого

/dev/xyz: 123 4567 8910112238 20
/dev/xyz: 123 4567 8915712347 19
/dev/xyz: 123 4567 8916412345 22
/dev/xyz: 123 4567 8910312342 25
/dev/xyz: 123 4567 8910112361 18
/dev/xyz: 123 4567 8910112343 20

И это просто продолжает работать и, как только у него есть причина, что-то выводит. Так что нет конца казни.

Нет, эхо работает отлично, однако, когда я пытаюсь использовать оператор '>', это не похоже на запись в файл.

например,

#somedevice -getevent > my_record_file

это не работает должным образом, my_record_file получает данные, записанные в него только с интервалами , однако я хочу, чтобы они были записаны немедленно.

Есть идеи?

Ответы [ 4 ]

5 голосов
/ 17 марта 2012

Выход буферизуется, потому что стандартная библиотека C меняет режим буферизации вывода в зависимости от того, является ли stdout терминальным устройством.Если это терминальное устройство (согласно isatty(3)), тогда стандартный вывод с буферизацией строки : он сбрасывается каждый раз, когда пишется символ новой строки.Если это не терминальное устройство, то оно полностью буферизовано : оно сбрасывается только при записи определенного объема данных (обычно порядка 4–64 КБ).

Таким образом, когда вы перенаправляете вывод команды в файл с помощью оператора перенаправления оболочки >, она больше не выводится на терминал и буферизует ее вывод.Программа может изменить свой режим буферизации с setvbuf(3) и друзьями, но программа должна сотрудничать, чтобы сделать это.Многие программы имеют параметры командной строки, чтобы сделать их буферизованными, например, grep(1) '--line-buffered.Посмотрите, есть ли у вашей команды аналогичная опция.

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

2 голосов
/ 17 марта 2012

Команда somedevice, вероятно, использует "Стандартную библиотеку ввода / вывода", и в этой библиотеке буферизация включена по умолчанию.Он отключается, когда выход поступает на терминал / консоль.

Можете ли вы изменить программу somedevice?Если нет, вы все равно можете взломать его.Подробнее см. http://www.pixelbeat.org/programming/stdio_buffering/.

0 голосов
/ 17 марта 2012

Вероятно, это связано с тем, что стандартный вывод вашей команды "somedevice -getevent" буферизован блоком.Согласно this , stdout по умолчанию буферизуется строкой (то есть, что вы хотите), если stdout является терминалом, и иначе буферизуется блоком.для вашей команды somedevice, чтобы увидеть, можете ли вы сделать вывод небуферизованным или буферизованным.Если нет, stdbuf -oL somedevice -getevent > my_record_file должен делать то, что вы хотите.

0 голосов
/ 17 марта 2012

Вы можете попробовать «тройник»:

somedevice -getevent | tee -a my_record_file

Опция '-a' - добавлять, а не просто заменять содержимое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...