あるファイルハンドルから別のファイルハンドルに出力をリダイレクトするにはどうすればよいですか?
-
03-07-2019 - |
質問
Perl(Linux上で実行)から、別々の時間に実行される2つの部分で構成されるプロセスのパイプラインをセットアップしたい。
例:
コンシューマープロセスを開始します:
open( OUT, "| tar xvf - " ) || die "Failed: tar: $!";
その後、プロデューサープロセスを開始します:
open( IN, "gpg -d $file |" ) || die "Failed: gpg: $!";
しかし、どういうわけかgpgからの出力をtarへの入力にリダイレクトします。
ループを作成してこれを行うことができます:
while (<IN> ) {
print OUT;
}
ただし、リダイレクトを使用して2つのプロセスを何らかの方法で結合できるかどうかを知りたいです。
解決
追加
pipe( IN, OUT );
2つのオープンステートメントの前。それだけです!
もっと複雑なことをしたい場合は、IPC :: Run CPANモジュールをお勧めします:
http://search.cpan.org/dist/IPC-Run/
プロセスを開始し、入力と出力を結び付け、チェーンの任意のポイントでロギングまたはリダイレクトを追加できます。
他のヒント
2つのプロセスが完全に無関係である場合、FIFOを使用します。
use POSIX qw(mkfifo);
mkfifo($path, 0700) or die "mkfifo $path failed: $!";
これにより、$ pathにFIFOが作成されます。 1つのプロセスがそのファイルに書き込み、他のプロセスがそのファイルから読み取るようにします。
Proc :: SafeExec を使用すると、プロセスとファイルを結び付けることができますほぼ任意の方法で簡単に処理します。次に例を示します。
use strict;
use warnings;
use Proc::SafeExec;
open(my $ls, "-|", "ls", "-l") or die "Err: $!";
open(my $fh, ">", "tmp.txt") or die "Err: $!";
my $p = Proc::SafeExec->new({
exec => [qw(sed -e s/a/b/)],
stdin => $ls,
stdout => $fh,
});
$p->wait();
IPC :: Runを見ると、ずっとシンプルに見えます...代わりにIPC :: Runを使用した同じ例です:
use IPC::Run qw(run);
run [qw(ls -l)], "|", [qw(sed -e s/a/b/)], ">", "tmp.txt";
所属していません StackOverflow