如果我在Unix/Linux系统上的Perl脚本中这样做:
open(my $fh, 'cat|');
是否涉及shell? 如果没有,那么这个呢:
open(my $fh, 'cat -v|');
我尽可能想避免使用Shell,我甚至知道如何实现:
如果可能的话,我希望避免使用Shell,并且我甚至知道如何做到这一点:
open(my $fh, '-|') || exec('cat', '-v');
但简洁性也很有价值。
从open开始,以下是编程示例代码
每个块中的最后两个示例以“列表形式”显示管道,但并非所有平台都支持此功能。一个好的经验法则是,如果您的平台有一个真正的fork(换句话说,如果您的平台是UNIX,包括Linux和MacOS X),则可以使用列表形式。您需要使用管道的列表形式,这样您可以传递文字参数给命令,而不会让shell解释其中的shell元字符。 但是,这也使您无法打开到故意包含shell元字符的命令的管道,[...]
(我的强调)
在此之前的最后一个示例是
这个例子与你提出的问题几乎完全相同。因此,采用“列表形式”就不需要使用 shell。对于system也是如此(但是,遗憾的是,对于qx来说不是这样)。open(my $fh, "-|", "cat", "-n", $file);
capturex
,关于qx
的问题无能为力。 - ikegami