如何通过管道传输字符串以处理'STDIN?

How to pipe a string to process' STDIN?

我有一个命令需要来自管道的输入。例如,考虑著名的 cat 命令:

$ echo Hello | cat
Hello

假设我在 Perl 6 程序中有一个字符串,我想将其传递给命令:

use v6;

my $input = 'Hello'; # This is the string I want to pipe to the command.
my $proc  = run 'cat', :in($input);

这不起作用(我没有输出)。我可以解决这个问题 调用 bashecho:

my $proc  = run 'bash', '-c', "echo $input | cat";

但是有没有办法不用 运行 bashecho 就可以做到这一点?

在 Perl5 中,我可以简单地执行 my $pid = open my $fh, '|-', 'cat'; 然后 print $fh $str

通过管道传输多个命令也很容易。实现相当于管道echo "Hello, world" | perl 6 中的 cat -n,并捕获第二个命令的输出,您可以执行

my $p1 = run 'echo', 'Hello, world', :out;
my $p2 = run 'cat', '-n', :in($p1.out), :out;
say $p2.out.get;

您也可以直接从您的程序提供 :in 管道,方法是将其设置为 True,这将使管道可通过 Proc 上的 .in 方法使用:

my $p = run "cat", "-n", :in, :out;
$p.in.say: "Hello,\nworld!";
$p.in.close;
say $p.out.slurp: :close;
# OUTPUT: «1  Hello,␤ 
#          2  world!␤» 

直接来自 docs,顺便说一句