How to pipe a string to process' STDIN?

你说的曾经没有我的故事 提交于 2019-12-23 18:24:23

问题


I have a command that expects input from a pipe. For example, consider the famous cat command:

$ echo Hello | cat
Hello

Suppose I have a string in a Perl 6 program that I want to pipe to the command:

use v6;

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

This does not work (I get no output). I can work around the problem by invoking bash and echo:

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

But is there a way I can do this without running bash and echo?

In Perl5, I could simply do my $pid = open my $fh, '|-', 'cat'; and then print $fh $str.


回答1:


Piping several commands is easy too. To achieve the equivalent of the pipe echo "Hello, world" | cat -n in Perl 6, and capture the output from the second command, you can do

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

You can also feed the :in pipe directly from your program, by setting it to True, which will make the pipe available via .in method on the Proc:

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!␤» 

Straight from the docs, btw



来源:https://stackoverflow.com/questions/47271120/how-to-pipe-a-string-to-process-stdin

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!