首页 > 解决方案 > Does opening a pipeline in Perl involve a shell?

问题描述

If I do this in a Perl script on a Unix/Linux system:

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

is a shell involved? And if not, what about this:

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

I would like to avoid a shell, if possible, and I even know how to do it:

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

but brevity is also valuable.

标签: shellperlunixpipe

解决方案


open,以下代码示例

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

(我的重点)

之前的最后一个例子是

open(my $fh, "-|", "cat", "-n", $file);

顺便说一句,这几乎正是您在问题中的示例。

所以使用“列表形式”并且没有外壳。这也适用于系统(但是,唉,不适用于qx


推荐阅读