Перенаправление stderr сценария Ruby не работает должным образом

Файл устройства не «указывает на несколько файлов». Файл устройства даже не «указывает» на один файл. Файл устройства указывает на драйвер.Драйвер содержит код, который обрабатывает операции чтения и записи.

Между данными, которые считываются с устройства, и данными, которые записываются, не обязательно должна быть связь. На одних устройствах он есть, на других нет. Например, на диске данные, которые считываются в определенной позиции, — это данные, которые ранее были записаны в эту позицию. С другой стороны, при использовании последовательного порта данные, записанные на устройство, отправляются по последовательной линии, а данные, считываемые с устройства, принимаются по последовательной линии; то, что отправлено, не зависит от того, что получено.

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

1
11.12.2016, 01:47
1 ответ

Это особенность библиотеки журналов Ruby метадон , используемый этим сценарием. Он ведет себя по-разному в зависимости от того, являются ли терминалы стандартным выводом и стандартной ошибкой.

См. Метод initialize в cli_logger.rb . Как описано в комментариях:

Регистратор, который регистрирует сообщения об ошибках на втором устройстве; полезно для обеспечения перехода сообщений об ошибках к стандартным ошибкам. Это должно быть довольно умным, чтобы поступать правильно. Если оба устройства регистрации - tty, например одно переходит к стандартной ошибке, а другое к стандартному выводу, сообщения появляются только один раз в общем потоке вывода. Другими словами, зарегистрированная ОШИБКА будет отображаться только в стандартной ошибке.Если какое-либо устройство журнала НЕ является терминалом, тогда все сообщения отправляются на + log_device + и только ошибки отправляются на + error_device +

. Вы можете оспорить утверждение о том, что это «довольно разумно» правильная вещь". Более разумным по умолчанию для модуля ведения журнала было бы логирование в stderr и игнорирование stdout.

0
28.01.2020, 01:06

Теги

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