我很困惑,简单的代码无法返回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
答案 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 $!";