Raku:将字符串发送到子进程的标准输入
Raku: Sending a string to a subprocess's standard input
我想将一个字符串发送到子进程的标准输入流,就像我在 Perl 5 中可能做的那样:
pipe *READ, *WRITE;
if (my $pid = fork()) {
close READ;
print WRITE "Hello world!\n";
close WRITE;
} else {
close WRITE;
open STDIN, '<&=' . fileno READ;
close READ;
exec 'cat';
}
Raku 中的等效结构是什么?
我可以将任何输入发送到外部 cat
进程以将其返回流中,我可以将其传递给另一个进程,但这太糟糕了。
我发现 this Raku 模块似乎相关,但它有“输入和输出”作为 TODO,所以它现在对我没有帮助。
此站点上还有 与此站点非常匹配。那个作者要求一个不依赖外部进程的解决方案,就像我一样,但接受的解决方案仍然使用外部进程。
最后,我注意到 Raku 的 IO::Pipe
class 的 docs,这似乎符合要求。但是,该页面显示:
Pipes can be easily constructed with sub run and Proc::Async.new.
...这是我明确想要避免的。我试着创建一个新的 IO::Pipe
对象,希望我能以自然的方式使用它的 in
和 out
流,但我得到:
> my $pipe = IO::Pipe.new
Required named parameter 'on-close' not passed
in block <unit> at <unknown file> line 1
文档页面上没有提到该参数,所以我想我在这里冒险进入了未定义的领域。
事实证明这非常容易。只需为 run
的 in
参数提供布尔 True
值,然后访问生成的进程的 in
字段并写入它。
my $proc = run 'my-command', 'and', 'args', :in;
$proc.in.say('Hello world!');
$proc.in.close;
我想将一个字符串发送到子进程的标准输入流,就像我在 Perl 5 中可能做的那样:
pipe *READ, *WRITE;
if (my $pid = fork()) {
close READ;
print WRITE "Hello world!\n";
close WRITE;
} else {
close WRITE;
open STDIN, '<&=' . fileno READ;
close READ;
exec 'cat';
}
Raku 中的等效结构是什么?
我可以将任何输入发送到外部 cat
进程以将其返回流中,我可以将其传递给另一个进程,但这太糟糕了。
我发现 this Raku 模块似乎相关,但它有“输入和输出”作为 TODO,所以它现在对我没有帮助。
此站点上还有
最后,我注意到 Raku 的 IO::Pipe
class 的 docs,这似乎符合要求。但是,该页面显示:
Pipes can be easily constructed with sub run and Proc::Async.new.
...这是我明确想要避免的。我试着创建一个新的 IO::Pipe
对象,希望我能以自然的方式使用它的 in
和 out
流,但我得到:
> my $pipe = IO::Pipe.new
Required named parameter 'on-close' not passed
in block <unit> at <unknown file> line 1
文档页面上没有提到该参数,所以我想我在这里冒险进入了未定义的领域。
事实证明这非常容易。只需为 run
的 in
参数提供布尔 True
值,然后访问生成的进程的 in
字段并写入它。
my $proc = run 'my-command', 'and', 'args', :in;
$proc.in.say('Hello world!');
$proc.in.close;