Dies ist gründlich abgedeckt in perlfaq8
. Da Sie eine Piped Open verwenden, sind die relevanten Beispiele diejenigen, die open3
aus dem Kernmodul IPC::Open3
gehen.
Eine andere Option ist die Verwendung IPC::Run
für die Verwaltung Ihrer Prozesse, und die pump
Funktion wird tun, was Sie brauchen. Die IPC::Open3
Dokumentation sagt für IPC::Run
Dies ist ein CPAN-Modul, das eine bessere Fehlerbehandlung und mehr Einrichtungen als Open3 hat.
mit einem dieser können Sie STDOUT
und STDERR
getrennt oder zusammen manipulieren, je nach Bedarf. Für eine bequeme und vollständige Ausgabeerfassung siehe auch Capture::Tiny
.
Im Gegensatz zur 2>output
Umleitung gibt es keine elementaren Methoden für die offene Pipe.
Wenn Sie nichts dagegen haben die Ströme Vermischung oder STDOUT
ganz zu verlieren, eine weitere Option ist
my $command = 'cmd 2>&1 1>/dev/null' # Remove 1>/dev/null to have both
my $pid = open my $cmdOutput, "-|", $command;
while (<$cmdOutput>) { print } # STDERR only
Die erste Umleitung STDERR
Stream mit STDOUT
verschmilzt, damit Sie sie beide bekommen, und gemischt (mit STDOUT
gepuffert, so kann es gut laufen. Die zweite Umleitung sendet die STDOUT
weg, so dass Sie nur die STDERR
des Befehls aus dem Handle lesen.
Die Frage ist, über einen externen Befehl ausführen open
verwenden, aber ich möchte zu erwähnen, dass die kanonischen und einfache qx
(Backticks) können auf die gleiche Art und Weise verwendet werden. Es gibt die STDOUT
zurück, so dass die Umleitung genau wie oben benötigt wird, um STDERR
zu erhalten.Der Vollständigkeit halber:
my $cmd = 'cmd_to_execute';
my $allout = qx($cmd 2>&1); # Both STDOUT and STDERR in $out, or
my $stderr = qx($cmd 2>&1 1>/dev/null); # Only STDERR
my $exit_status = $?;
Die qx
legt den Exit-Code Kindprozess (Status) in $?
. Dies kann dann auf Fehlermodi untersucht werden; siehe eine Zusammenfassung in der qx
Seite oder eine sehr gründliche Diskussion in I/O operators in perlop.
Beachten Sie, dass die STDERR
, die auf diese Weise zurückgegeben wird, aus dem Befehl ist, wenn es ausgeführt wurde. Wenn der Befehl selbst nicht ausgeführt werden konnte (für einen Tippfehler im Befehlsnamen oder fork
aus irgendeinem Grund fehlgeschlagen), wird $?
-1
und der Fehler wird in $!
sein.
Warum sagst du * "Ich möchte auch keine externen Module verwenden" * und was meinst du mit "extern"? – Borodin
@Borodin Nun, ich darf keine CPAN-Module oder Module installieren, die nicht Teil der Perl-Distribution sind. Ich habe meine Frage korrigiert :) – taiko
Wenn Sie CPAN-Module nicht verwenden möchten, verwenden Sie die falsche Sprache. Wenn Sie "nicht dürfen" CPAN-Module verwenden, dann haben Sie den falschen Job :-) –