2015-09-25 2 views
0

В одном из сообщений ниже предлагается метод захвата STDOUT в файл без влияния на запись в STDOUT (терминал).Печать STDOUT для обоих файлов и STDOUT с помощью perl

open my $tee, "|-", "tee E:/log.txt"; 

Для последовательности, как показано ниже:

print $tee "Log1\n"; 
print $tee "Log2\n"; 
my $input = <STDIN>; 
print $tee "Log3\n"; 

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

Log1 
Log2 
Log3 

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

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

ответ

0

Установите дескриптор для небуферизованного вывода с помощью

$old_fh = select($tee); 
$| = 1; 
select($old_fh); 
+0

Или: использовать IO :: Handle; $ tee-> autoflush (1); –

+0

Спасибо, это работает так, как я ожидал. Не могли бы вы немного объяснить, что это такое? Что означает «$ | = 1»? –

+0

Эта функция находится глубоко в библиотеке Unix C, которая также используется Perl. Чтобы оптимизировать использование ресурсов, он не будет записывать выходные данные сразу, а ожидает, пока буфер не будет заполнен или не будет введен в консоль. $ | специальная переменная может использоваться для отключения этого поведения в Perl. См. Также здесь: http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandles. –

Смежные вопросы