كيف يمكنني إعادة توجيه الإخراج من مقبض ملف إلى آخر؟

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 في مسار $. الآن لديك واحدة الكتابة عملية لهذا الملف، وعملية أخرى القراءة منه.

بروك :: 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 :: تشغيل، يبدو أبسط كثيرا ... هنا هو نفس المثال باستخدام IPC :: تشغيل بدلا من ذلك:

use IPC::Run qw(run);

run [qw(ls -l)], "|", [qw(sed -e s/a/b/)], ">", "tmp.txt";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top