Стандартный поток вывода и стандартные ошибки обычно доступны двумя способами:
$stdout
и STDOUT
$stderr
и STDERR
Достаточно умный человек может также открыть свои собственные копии, используя IO.new
с аргументом дескриптора файла:
sneaky = IO.new(2, 'w')
И теперь у вас есть доступ на запись к стандартупоток ошибок через sneaky
, не имеющий ничего общего с $stderr
или STDERR
.
Переназначение $stderr
и $stdout
должно работать нормально, если что-то в вашем коде, ваших гемах или самом Ruby не являетсяиспользуя константы (STDOUT
, STDERR
) или осуществляет доступ к потокам напрямую через stdio C, низкий уровень unix read
/ write
с помощью числовых файловых дескрипторов или открывает собственный доступ к потокам с помощью IO.new
.Я не копался в источнике, но сомневаюсь, что присвоение $stdout
сделает что-нибудь для stdout
в C-land или файлового дескриптора 1 в Unix-land.
Если вам действительно нужно перехватить стандартвывод и потоки ошибок, тогда вам, вероятно, лучше написать сценарий оболочки-оболочки, чтобы перенаправить потоки за вас.
ОБНОВЛЕНИЕ : Если вы в основном (только?) обеспокоеныо том, чтобы изменить $stdout
и $stderr
внутри вашего script/runner
кровотечения в остальной части вашего Rails-приложения, тогда вам не нужно об этом беспокоиться.Каждый процесс - ваш script/runner
процесс и сколько угодно серверных процессов, запущенных вашим основным приложением, - получает свой собственный набор глобальных переменных, так что вы можете изменять их в своем сценарии так, как вам хочется, без проблем в вашем основном приложении.Конечно, вам все равно придется беспокоиться о драгоценных камнях, используя STDOUT
вместо $stderr
или IO.new
, чтобы получить свой собственный частный стандарт.