gpt4 book ai didi

命令中的 Perl 管道打开问题

转载 作者:行者123 更新时间:2023-12-01 02:39:04 25 4
gpt4 key购买 nike

我很疑惑,简单的代码对于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

这是为x86_64-linux-thread-multi构建的perl,v5.8.8

最佳答案

当你使用花哨的 "|-" 风格时,你并不是在指定要运行的 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 上找出正确的引用是一项吃力不讨好的工作,而且几乎是不可能的。

关于命令中的 Perl 管道打开问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9791593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com