дальнейшее чтение

дальнейшее чтение

Я написал программу (на Ruby), и она хорошо работает. Она выводит несколько строк текста, затем делает паузу на минуту, а затем повторяет вышеописанное.

Это работает хорошо (в терминале Mac OS X), но я заметил, что если я хочу сохранить запись вывода, используя

ruby myscript.rb | tee record.txt

то вывод не будет показан на экране, пока вывод не достигнет определенного размера, возможно, нескольких кб. Однако это может означать 5 или 10 минут без ничего на экране (и ничего в файле, если я нажму CTRL-C).

Я мог бы изменить программу, чтобы сбросить вывод, но я думал, что приложение должно быть агностиком относительно того, что используется с выводом в STDOUT. Так что можно teeзаставить работать хорошо (возможно, с опцией), или можно использовать любую другую команду, или, может быть, это опция Bash или приложения Terminal? Есть ли способ?

решение1

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

Вы думали неправильно. Библиотеки времени выполнения нескольких языков программирования, включая языки C и C++, все разделяют семантику изменения буферизации в зависимости от того, обнаруживают ли они, что поток присоединен к терминальному устройству.

Во многих случаях это определенная часть языка. Например, стандарт языка C гласит:

При первоначальном открытии стандартный поток ошибок не полностью буферизован; стандартные потоки ввода и вывода полностью буферизованы тогда и только тогда, когда можно определить, что поток не ссылается на интерактивное устройство.

Обычный выбор, если поток не подключен к терминальному устройству, — выбрать буферизацию единиц, буферизацию строк или полную буферизацию. Буферизация единиц и буферизация строк обычны для стандартной ошибки; полная буферизация для стандартного вывода. Но это зависит от языка.

Таким образом, чтобы вывод не был полностью буферизован, когда выходной поток представляет собой канал в таких языках, вам нужно

  • написать свою программу, сделать стандартную строку вывода буферизованной, интеллектуально буферизованной или небуферизованной;
  • используйте вещи, которые подключаются к библиотеке времени выполнения вашего конкретного языка программирования, например stdbufкомандуесливаш язык программирования — C или использует (часть потоков ввода-вывода) библиотеку времени выполнения C в качестве своей основы (что не поддерживается некоторыми языками программирования); или
  • используйте такие инструменты, ptybandageкоторые заставляют программу думать, что ее стандартный вывод — это терминал, при этом принимая этот вывод и отправляя его на конец конвейера для записи.

дальнейшее чтение

решение2

Пожалуйста, посмотрите на ответ.https://stackoverflow.com/a/11337109/5656721так как это распространенная проблема. Вы могли бы использоватьстандартный буферилирасбуферитьдля вашей программы Ruby тоже.

Связанный контент