簡體   English   中英

實時反引輸出處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM