在Perl中打开管道是否涉及shell?

5

如果我在Unix/Linux系统上的Perl脚本中这样做:

open(my $fh, 'cat|');

是否涉及shell? 如果没有,那么这个呢:

open(my $fh, 'cat -v|');

我尽可能想避免使用Shell,我甚至知道如何实现:

如果可能的话,我希望避免使用Shell,并且我甚至知道如何做到这一点:

open(my $fh, '-|') || exec('cat', '-v');

但简洁性也很有价值。

1个回答

8

open开始,以下是编程示例代码

每个块中的最后两个示例以“列表形式”显示管道,但并非所有平台都支持此功能。一个好的经验法则是,如果您的平台有一个真正的fork(换句话说,如果您的平台是UNIX,包括Linux和MacOS X),则可以使用列表形式。您需要使用管道的列表形式,这样您可以传递文字参数给命令,而不会让shell解释其中的shell元字符。 但是,这也使您无法打开到故意包含shell元字符的命令的管道,[...]

(我的强调)

在此之前的最后一个示例是

open(my $fh, "-|", "cat", "-n", $file);
这个例子与你提出的问题几乎完全相同。因此,采用“列表形式”就不需要使用 shell。对于system也是如此(但是,遗憾的是,对于qx来说不是这样)。

1
参见核心模块IPC::System::Simple中的capturex,关于qx的问题无能为力。 - ikegami
IPC::System::Simple不是核心模块,但IPC::ReadpipeX的文档展示了一种核心方法来模拟qx/readpipe而绕过shell(剧透一下,它与这个答案非常相似)。 - Grinnz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接