2010-07-31 3 views
2

Я использую синтаксис back-ticks perl для запуска некоторых команд. Я хотел бы, чтобы выход команды записывался в файл, а также выводился на стандартный вывод. Я могу выполнить первый, добавив > в конце строки с обратным тиком, но я не знаю, как горячий, чтобы выход печатался сразу же после его создания. Если я что-то вродеКак получить вывод команды немедленно?

print `command`; 

вывод печатается только после завершения выполнения command.

Спасибо, Dave

ответ

8

Вы не можете сделать это с кавычку, когда они возвращаются к программе Perl только тогда, когда исполнение закончил.

Так,

print `command1; command2; command3`; 

будет ждать, пока не закончит command3 выводить что-либо.

Вы должны использовать трубу вместо обратных кавычек, чтобы иметь возможность немедленно получить результат:

open (my $cmds, "-|", "command1; command2; command3"); 
while (<$cmds>) { 
     print; 
} 
close $cmds; 

После того, как вы сделали это, то вы должны увидеть, если вы хотите или не буферизации (в зависимости от того, как непосредственного вы хотите, чтобы выход быть): Suffering from buffering?

для печати и хранения выходных, вы можете открыть() файл, чтобы написать вывод в:

open (my $cmds, "-|", "command1; command2; command3"); 
open (my $outfile, ">", "file.txt"); 
while (<$cmds>) { 
     print; 
     print $outfile $_; 
} 
close $cmds; 
close $outfile; 
+0

Спасибо. Не могли бы вы объяснить/направить меня к объяснению того, что на самом деле делает трубопровод ('' - | "')? А также, как я могу сохранить вывод команды в файл (в дополнение к его печати)? –

+0

- | говорит, что вывод команды направлен на нашу программу в три вызова функции open(). - | примерно эквивалентно выполнению команды «command_ our_program». С другой стороны, | - говорит, что выход из программы будет направлен на команду, поэтому она будет примерно эквивалентна команде «our_program |». Они не совсем то же самое, потому что наша_программа продолжается после того, как она выполняется с помощью команды, но это, вероятно, послужит вам идеей. –

+0

Еще раз спасибо. А для второй части моего вопроса - как я могу вывести вывод в «настоящий» файл? –

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