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

q.u*_*tow 5 unix shell perl pipe

如果我在 Unix/Linux 系统上的 Perl 脚本中执行此操作:

open(my $fh, 'cat|');
Run Code Online (Sandbox Code Playgroud)

是否涉及外壳?如果没有,那怎么办:

open(my $fh, 'cat -v|');
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我想避免使用 shell,我什至知道该怎么做:

open(my $fh, '-|') || exec('cat', '-v');
Run Code Online (Sandbox Code Playgroud)

但简洁也很有价值。

zdi*_*dim 9

open,以下代码示例

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

(我的重点)

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

open(my $fh, "-|", "cat", "-n", $file);
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这几乎正是你从问题中得到的例子。

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