Perl open(FH,“grep foo bar |”) - 当grep什么都不返回时,关闭FH失败

时间:2013-04-27 01:32:42

标签: perl pipe

我正在打开 grep 命令的管道并逐行读取结果。完成后,我关闭管道。如果 grep 找到了任何内容,则关闭()会正常完成。如果 grep 没有找到任何内容,则关闭()不起作用。

这是 foo 来演示问题:

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

my $search = shift // die "Usage: foo search_string";

open my $grep_h, "grep '$search' ./foo |"
  or die "open grep failed: $!";

while (defined (my $line = <$grep_h>)) {
    chomp $line;
    say "\t: $line";
}
close $grep_h or warn "Error closing grep pipe: $!";

我在这里调用 foo 来搜索'warn':

~/private/perl$ ./foo warn
    : use warnings;
    : close $grep_h or warn "Error closing grep pipe: $!";

在这里,我调用 foo 来搜索“blarg”:

~/private/perl$ ./foo blarg
Error closing grep pipe:  at ./foo line 16.

为什么我收到此错误?

1 个答案:

答案 0 :(得分:6)

close($child)设置$?。如果$?非零,则返回false。

close($grep_h);
die "Can't close: $!\n" if $? == -1;
die "Child died from signal ".($? & 0x7F)."\n" if $? & 0x7F;
die "Child exited from error ".($? >> 8)."\n" if $? >> 8;

你会得到“Child from error 1”,因为grep在找不到匹配项时会返回错误。

$ echo foo | grep foo
foo

$ echo $?    # Equivalent to Perl's $? >> 8
0

$ echo foo | grep bar

$ echo $?
1