Как я могу перенаправить выходные данные из одного дескриптора файла в другой?

StackOverflow https://stackoverflow.com/questions/618953

  •  03-07-2019
  •  | 
  •  

Вопрос

Я хочу настроить конвейер процессов из Perl (работающий в Linux), состоящий из двух частей, запускаемых в разное время.

Например:

Запустите потребительский процесс:

open( OUT, "| tar xvf - " ) || die "Failed: tar: $!";

затем, намного позже, запустите процесс создания:

open( IN, "gpg -d $file |" ) || die "Failed: gpg: $!";

но затем каким-то образом перенаправьте выходные данные из gpg во входные данные в tar.

Я могу сделать это, создав цикл:

while (<IN> ) {
  print OUT;
}

Но я хотел бы знать, могу ли я каким-то образом склеить два процесса вместе с перенаправлением.

Это было полезно?

Решение

Добавить

pipe( IN, OUT );

Перед двумя открытыми заявлениями.Вот и все!

Если вы хотите сделать что-то более сложное, я бы порекомендовал модуль IPC::Run CPAN:

http://search.cpan.org/dist/IPC-Run/

Это позволяет запускать процессы, связывать их входные и выходные данные вместе и добавлять протоколирование или перенаправление в любой точке цепочки.

Другие советы

Если эти два процесса совершенно не связаны, используйте FIFO.

use POSIX qw(mkfifo);
mkfifo($path, 0700) or die "mkfifo $path failed: $!";

Это создает FIFO в $path .Теперь попросите один процесс записать в этот файл, а другой процесс прочитать из него.

Мне нравится Процедура::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";
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top