假设我有这个脚本:
# prog.p6
my $info = run "uname";
Run Code Online (Sandbox Code Playgroud)
当我跑步时prog.p6
,我得到:
$ perl6 prog.p6
Linux
Run Code Online (Sandbox Code Playgroud)
有没有办法存储返回值的字符串版本并阻止它输出到终端?
已经存在类似的问题,但它没有提供具体的答案.
您需要$*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)
默认情况下,run
仅将STDOUT
和传递STDERR
给父进程的STDOUT
和STDERR
。
你必须告诉它做其他事情。
最简单的就是直接给它: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/null
with :!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 可能会更好。