Perl管道打开问题与'in命令

时间:2012-03-20 17:09:31

标签: perl file-io pipe

我很困惑,简单的代码无法返回PIPE2打开的错误,但它是为类似的PIPE3做的!  如果有任何元字符,我读取perl处理管道开口的方式不同,但我不知道如何使用正确的错误检查编写无效管道的代码。如何检查PIPE2打开失败? $?$!也未收到错误。
感谢。

open(PIPE2,"|/bin/echod 'sometxt'")||die "Pipe2 cannot open\n";
print PIPE2 "echoed 2\n";
close PIPE2;

open(PIPE3,"|-","/bin/echod sometxt")||die "Pipe3 cannot open\n";
print PIPE3 "echoed 3\n";
close PIPE3;

执行后从命令提示符:

sh: /bin/echod: No such file or directory   
Pipe3 cannot open

这是为perl, v5.8.8

构建的x86_64-linux-thread-multi

2 个答案:

答案 0 :(得分:2)

当您使用花哨的"|-"样式时,您没有指定要运行的shell命令,而是要传递给 execvp (2)系统调用的参数列表。

open(PIPE2,"|/bin/echod 'sometxt'")      || die "Pipe2 cannot open: $!";
print PIPE2 "echoed 2\n";
close(PIPE2)                             || die "Pipe2 cannot close: $!";

open(PIPE3,"|-","/bin/echod", "sometxt") || die "Pipe3 cannot open: $!";
print PIPE3 "echoed 3\n";
close(PIPE3)                             || die "Pipe3 cannot close: $!";

只有在传入未知内容的变量时,如果不希望shell扩展通配符,解释管道和重定向符号等,才会使用第二种形式。

第一种形式是当希望发生这种情况时,或者当命令中有常量字符串或已知内容字符串时。我几乎总是使用第一种形式,保留第二种形式,如

等棘手的情况
open(GREPPER, "grep $expr @files |")

因为这是一个吃力不讨好而且相当不可能的工作,试图找出$expr那里正确的引用。

答案 1 :(得分:1)

(如评论中所述) 如果open函数包含管道|(而不是|--|),则可以在close文件句柄处理打开函数失败。

以下是我将如何做到这一点

open(PIPE2,"|/bin/echod 'sometxt'");
print PIPE2 "echoed 2\n";
close(PIPE2) or die "Pipe2 Cannot open $!";