私はshell
で遊んでいました。呼び出し元のプログラムで標準のファイルハンドルを変更したときの動作はどうでしたか?彼らは親プロセスからのストリームを継承することを意味する、 - 「」ERR 3つの標準に-発売されるプログラムの流れ、およびデフォルトにしている
は$うちに$および$:Proc氏は述べています。
私の知る限り、外部プログラムは、同じファイルを使用していないハンドル:
#!/Applications/Rakudo/bin/perl6
#`(
make an external Perl 6 program the outputs to standard handles
)
my $p6-name = 'in-out.p6'.IO;
#END try $p6-name.unlink; # why does this cause it to fail?
my $p6-fh = open $p6-name, :w;
die "Could not open $p6-name" unless ?$p6-fh;
$p6-fh.put: Q:to/END/;
#!/Applications/Rakudo/bin/perl6
$*ERR.say(qq/\t$*PROGRAM: This goes to standard error/);
$*OUT.say(qq/\t$*PROGRAM: This goes to standard output/);
END
$p6-fh.close;
say $p6-name.e ?? 'File is there' !! 'File is not there';
die "$p6-name does not exist" unless $p6-name.e;
{
#`(
Start with some messages to show that we can output to
the standard filehandles.
)
$*OUT.put: "1. standard output before doing anything weird";
$*ERR.put: "2. standard error before doing anything weird";
shell("perl6 $p6-name").so;
}
{
#`(
This block assigns a new filehandle to $*OUT and prints a
message to it. I expect that message to not show up in the
terminal.
It then calls run-them to fire off the external process. It
should inherit the same standard out and its standard out
messages should not show up. But, they do.
)
temp $*OUT = open '/dev/null', :w;
$*OUT.put: "3. temp redefine standard output before this message";
shell("perl6 $p6-name").so;
}
$*OUT.put: "4. everything should be back to normal";
出力は私がを/ dev/nullを開き、にそのファイルハンドルを割り当てる際にすることを示しています$*OUT
の場合、現在のプログラムの出力は端末に表示されません(3.
で始まる出力はありません)。私はshell
を呼び出すときしかし、その標準出力は、元の標準出力に行く:
File is there
1. standard output before doing anything weird
2. standard error before doing anything weird
in-out.p6: This goes to standard error
in-out.p6: This goes to standard output
in-out.p6: This goes to standard error
in-out.p6: This goes to standard output
4. everything should be back to normal
私はこれを実現する方法については心配していません。 Proc
オブジェクトを作成し、ファイルハンドルを渡すことができます。
何か他には何かがありますか?
MoarVMに関連するコードは、[MVM_proc_shell(https://github.com/MoarVM/MoarVM/blob/7bd72321b0f009178c1931d50c8faae6bf4a25d8/src/io/procops.c#L184)であると思われます。 Windowsでは、スクリプトを初めて実行すると、作成したばかりのファイルが見つかりません。2回目の実行では、( '/ dev/null'を' NUL'に置き換えて)同じ動作を観察します。 –