【发布时间】:2020-04-20 06:37:09
【问题描述】:
如果我在 Unix/Linux 系统上的 Perl 脚本中执行此操作:
open(my $fh, 'cat|');
是否涉及到外壳?如果没有,那该怎么办:
open(my $fh, 'cat -v|');
如果可能的话,我想避免使用 shell,我什至知道该怎么做:
open(my $fh, '-|') || exec('cat', '-v');
但简洁也很有价值。
【问题讨论】:
如果我在 Unix/Linux 系统上的 Perl 脚本中执行此操作:
open(my $fh, 'cat|');
是否涉及到外壳?如果没有,那该怎么办:
open(my $fh, 'cat -v|');
如果可能的话,我想避免使用 shell,我什至知道该怎么做:
open(my $fh, '-|') || exec('cat', '-v');
但简洁也很有价值。
【问题讨论】:
来自open,以下代码示例
每个块中的最后两个示例将管道显示为“列表形式”,但并非所有平台都支持。一个好的经验法则是,如果你的平台有一个真正的 fork(换句话说,如果你的平台是 Unix,包括 Linux 和 MacOS X),你可以使用列表形式。 您可能希望使用管道的列表形式,这样您就可以将文字参数传递给命令,而不会有 shell 解释其中的任何 shell 元字符的风险。 但是,这也会阻止您打开命令的管道故意包含 shell 元字符,[...]
(我的重点)
前面的最后一个例子是
open(my $fh, "-|", "cat", "-n", $file);
顺便说一句,这几乎正是您在问题中的示例。
【讨论】:
qx",参见核心模块 IPC::System::Simple 中的capturex