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
调用的输出将被缓冲
我有一个 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
调用的输出将被缓冲