Wenn Sie nicht über den Inhalt der STDERR wollen, dann ist die Erfassung() Befehl aus IPC::System::Simple Modul ist fast genau, was Sie nach:
use IPC::System::Simple qw(capture system $EXITVAL);
my $output = capture($cmd, @args);
my $exit_value = $EXITVAL;
können Sie Capture() verwenden, mit einem einzigen Argument um die Shell aufzurufen, oder mehrere Argumente, um die Shell zuverlässig zu vermeiden. Es gibt auch capturex(), die niemals die Shell aufruft, auch nicht mit einem einzigen Argument.
Im Gegensatz zu den integrierten System- und Backtick-Befehlen von Perl gibt IPC :: System :: Simple den vollständigen 32-Bit-Exitwert unter Windows zurück. Es wird auch eine detaillierte Ausnahme ausgelöst, wenn der Befehl nicht gestartet werden kann, in ein Signal übergeht oder einen unerwarteten Exit-Wert zurückgibt.Das bedeutet für viele Programme, anstatt zu prüfen, die Ausfahrt selbst Werte, können Sie verlassen sich auf IPC :: System :: Simple für Sie die harte Arbeit zu tun:
use IPC::System::Simple qw(system capture $EXIT_ANY);
system([0,1], "frobincate", @files); # Must return exitval 0 or 1
my @lines = capture($EXIT_ANY, "baznicate", @files); # Any exitval is OK.
foreach my $record (@lines) {
system([0, 32], "barnicate", $record); # Must return exitval 0 or 32
}
IPC :: System :: Simple ist rein Perl, hat keine Abhängigkeiten und funktioniert sowohl auf Unix- als auch auf Windows-Systemen. Leider bietet es keine Möglichkeit, STDERR zu erfassen, daher ist es möglicherweise nicht für alle Ihre Bedürfnisse geeignet.
IPC::Run3 bietet eine saubere und einfache Schnittstelle für die Wiederherstellung aller drei gängigen Dateihandles, aber leider überprüft es nicht, ob der Befehl erfolgreich war, also müssen Sie $ überprüfen? manuell, was überhaupt nicht Spaß macht. Bereitstellung einer öffentlichen Schnittstelle zur Überprüfung von $? ist etwas, das auf meinem to-do list für IPC :: System :: Simple ist, seit der Überprüfung von $? plattformübergreifend ist keine Aufgabe, die ich jemandem wünsche.
Im Namespace IPC:: befinden sich weitere Module, die Sie ebenfalls unterstützen können. YMMV.
Alles Gute,
Paul
Ich weiß nicht, warum die Links vermasselt sind. Alles sieht gut aus in Bearbeitung/Vorschau. –
Ich habe perl5porters einen Patch an IPC :: Open2 und :: Open3 geschickt, um die Waitpid-Sachen in der SYNOPSIS dieser Module anzuzeigen. :) –