如何存储run或shell返回的值?

uzl*_*xxx 4 perl6 raku

假设我有这个脚本:

# prog.p6
my $info = run "uname";
Run Code Online (Sandbox Code Playgroud)

当我跑步时prog.p6,我得到:

$ perl6 prog.p6
Linux
Run Code Online (Sandbox Code Playgroud)

有没有办法存储返回值的字符串版本并阻止它输出到终端?

已经存在类似的问题,但它没有提供具体的答案.

uge*_*exe 8

您需要$*OUT通过设置启用stdout管道,否则默认为该管道:out.所以:

my $proc = run("uname", :out);
my $stdout = $proc.out;
say $stdout.slurp;
$stdout.close;
Run Code Online (Sandbox Code Playgroud)

可以缩短为:

my $proc = run("uname", :out);
say $proc.out.slurp(:close);
Run Code Online (Sandbox Code Playgroud)

如果你想分别捕获stderr上的输出而不是stdout,你可以这样做:

my $proc = run("uname", :out, :err);
say "[stdout] " ~ $proc.out.slurp(:close);
say "[stderr] " ~ $proc.err.slurp(:close);
Run Code Online (Sandbox Code Playgroud)

或者如果你想将stdout和stderr捕获到一个管道,那么:

my $proc = run("uname", :merge);
say "[stdout and stderr] " ~ $proc.out.slurp(:close);
Run Code Online (Sandbox Code Playgroud)

最后,如果您不想捕获输出并且不希望它输出到终端:

my $proc = run("uname", :!out, :!err);
exit( $proc.exitcode );
Run Code Online (Sandbox Code Playgroud)


Bra*_*ert 5

默认情况下,run仅将STDOUT和传递STDERR给父进程的STDOUTSTDERR

你必须告诉它做其他事情。

最简单的就是直接给它:out并告诉它保留STDOUT。(短缺:out(True)

my $proc = run 'uname', :out;
my $result = $proc.out.slurp(:close);
Run Code Online (Sandbox Code Playgroud)
my $proc = run 'uname', :out;
for $proc.out.lines(:close) {
  .say;
}
Run Code Online (Sandbox Code Playgroud)

您还可以有效地告诉它只发送STDOUT/dev/nullwith :!out。(短缺:out(False)


您还可以做更多事情:out

{
  my $file will leave {.close} = open :w, 'test.out';
  run 'uname', :out($file); # write directly to a file
}

print slurp 'test.out'; # Linux
Run Code Online (Sandbox Code Playgroud)
my $proc = run 'uname', :out;

react {
  whenever $proc.out.Supply {
    .print

    LAST {
      $proc.out.close;
      done; # in case there are other whenevers
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您打算执行最后一项操作,那么使用 Proc::Async 可能会更好。