Perl 如何在没有缓冲的情况下执行 shell 脚本?

How can Perl execute a shell script with no buffering?

我有一个 shell 脚本 (testScript.sh) 打印到 stdout,稍等片刻,然后再次打印:

#!/bin/sh
echo "before"
sleep 2
echo "after"

我正在尝试从这样的 perl 脚本执行此 sh 脚本:

#!/usr/bin/perl -w
use strict;

$| = 1; # do I need this?

sub runCommand($) {
    my ($command) = @_;
    open CMD, "$command |" || die "Unable to run $command: $!";
    my @output = <CMD>;
    close CMD;
    print join('',@output);
}

runCommand("./testScript.sh");

如果我直接运行 shell 脚本我会立即看到"before",然后延迟,然后"after"。

但是,当我通过 perl 运行 脚本时,我首先得到延迟,然后打印 "before" 和 "after"。

我以为是因为Perl's I/O buffering,但是$| = 1好像没有什么效果。

我在这里错过了什么?如何通过 perl 执行脚本并立即写入 stdout?

您编写的代码等待从命令读取所有输入,然后加入并打印。你不可能像那样获得增量输出

您必须打印检索到的每一行,就像这样

open CMD, "$command |" || die "Unable to run $command: $!";
print while <CMD>;
close CMD;

是的,您确实需要 $| = 1,否则 print 调用的输出将被缓冲