[英]Realtime backtick output processing
我不知道這是否可行,但我正在努力通過套接字發送命令的輸出,以便在命令運行時它將顯示在客戶端和服務器計算機上。 當我嘗試使用反引號時,輸出不會保存到變量中,直到命令完成,這對於運行需要很長時間的命令是不利的。
問題:是否有辦法逐行掃描輸出,說產生另一個過程並讓它“觀察”變量?
編輯:這是我嘗試打開的
open DATA, "pause |" or die "Failed: $!";
while( defined(my $line = <DATA>)){
chomp($line);
print "$line\n";
}
我想在命令完成之前顯示輸出。
你有正確的方法。
my @cmd = ( 'perl', '-e', '$|=1; for (1..5) { print "$_\n"; sleep 1; }' );
open(my $pipe, '-|', @cmd)
or die("Can't launch child: $!\n");
while (defined( my $line = <$pipe> )) {
chomp($line);
print "<$line>\n";
}
寫入STDOUT時,大多數程序在STDOUT為終端時遇到換行符時刷新其輸出(“行緩沖”)。 當STDOUT不是終端時(“塊緩沖”),大多數程序回退到阻止輸出4 KiB或8 KiB的塊。 這就是為什么我不得不使用$|=1;
在上面的例子中的子程序中。
使用偽終端而不是管道使用行緩沖可以欺騙使用所述行為的程序。
my @cmd = ( 'unbuffer', 'perl', '-e', 'for (1..5) { print "$_\n"; sleep 1; }' );
open(my $pipe, '-|', @cmd)
or die("Can't launch child: $!\n");
while (defined( my $line = <$pipe> )) {
chomp($line);
print "<$line>\n";
}
IPC :: Run提供了一種創建偽終端的本機方法。
use IPC::Run qw( run );
my @cmd = ( 'perl', '-e', 'for (1..5) { print "$_\n"; sleep 1; }' );
my $buf = '';
run(\@cmd, '>pty>', sub {
$buf .= $_[0];
while ($buf =~ s/^(.*)\r\n//) {
print "<$1>\n";
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.