Was ist der Unterschied zwischen system, exec, und backticks in Perl?
In Perl, zu laufen, ein anderes Perl-script aus meinem Skript, oder laufen alle system-Befehle wie mv
, cp
, pkgadd
, pkgrm
, pkginfo
, rpm
etc, wir verwenden können, die folgenden:
system()
exec()
``
(Backticks)
Sind alle drei gleich, oder sind Sie unterschiedlich? Machen alle drei das gleiche Ergebnis in jedem Fall? Sind Sie in verschiedenen Szenarien eingesetzt, wie zum Aufruf eines Perl-Programms haben wir die Verwendung system()
und für die anderen müssen wir ``
(backticks).
Bitte beraten, wie ich bin derzeit mit system()
für alle Anrufe.
- Dies ist ein Duplikat von stackoverflow.com/questions/797127/...
- Dies ist nicht ein Duplikat ist, als diese Frage nicht erwähnt
exec()
. - Nein, aber es ist ein Duplikat von stackoverflow.com/questions/799968/... 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind alle Verschieden, und die docs erklären, wie Sie sich unterscheiden. Backticks capture und Ausgabe zurückgegeben werden;
system
gibt einen exit-status, undexec
kehrt nie zurück, wenn es erfolgreich ist.IPC::System::Simple ist wahrscheinlich das, was Sie wollen.
Bietet es eine sichere, tragbare alternativen zu den backticks, system() und andere IPC-Befehle.
Es erlaubt Ihnen auch, um zu vermeiden, die shell für die meisten von Sprach-Befehlen, die hilfreich sein kann in manchen Situationen.
Den besten option ist die Nutzung von einigen Modul, entweder in der standard-Bibliothek oder von CPAN, das macht den job für Sie. Es geht um mehr tragbar, und möglicherweise noch schneller für schnelle Aufgaben (ohne die Verzweigung in das system).
Jedoch, wenn das nicht gut genug für Sie ist, können Sie eine dieser drei, und Nein, Sie sind nicht das gleiche. Lesen Sie die perldoc Seiten auf
system()
,exec()
, und backticks um den Unterschied zu sehen.perldoc -f readpipe
.Aufrufen
system
ist in der Regel ein Fehler. Zum Beispiel, anstatt zu sagen,sollten Sie sagen,
Blick auf CPAN für Module, die mit anderen Befehlen für Sie. Wenn Sie finden, sich selbst zu schreiben eine Menge Anrufe zu
system
, kann es Zeit zu fallen zurück in ein shell-Skript statt.system
ist ein Fehler, aber die meisten Leute nennen es sind Fehler. Sie brauchen einen guten Grund zu nennensystem
.Gut, je mehr Leute desto mehr Antworten.
Meine Antwort ist generell vermieden werden externe Befehle-Ausführung. Wenn Sie die kann - Module verwenden. Es gibt keinen Punkt beim ausführen von "cp", "mv" und eine Menge anderen Befehl - es existieren Module, die es tun. Und der Vorteil der Verwendung von Modulen ist, dass Sie in der Regel arbeiten cross-Plattform. Während Ihr system("mv") möglicherweise nicht.
Wenn Sie in die situation, dass ich keinen anderen Weg, aber für den Aufruf von externen Befehl, ich benutze lieber IPC::Run. Die Idee ist, dass alle vereinfachende Methoden (backticks, qx, system, öffnen mit Rohr) sind von Natur aus unsicher, und die Aufmerksamkeit auf die Parameter.
Mit IPC::Run, ich Befehle ausführen, wie ich es tun würde, mit system( @array ), das ist viel sicherer, und ich kann eine Bindung zu stdin, stdout und stderr getrennt, mit Variablen oder Rückrufe, die sehr cool, wenn du wirst in der situation, die Sie zum übergeben von Daten an externes Programm von lang-Laufenden code.
Auch, es hat eine eingebaute Handhabung von timeouts, die kommen praktisch mehr als einmal 🙂
Wenn Sie nicht möchten, dass die shell immer mit einbezogen (in der Regel nicht) und, wenn warten auf den system-Befehl akzeptabel ist, empfehle ich die Verwendung von
IPC::Run3
. Es ist eine einfache, flexible, und hat die Allgemeine Aufgabe, die ein Programm ausführt, füttert es die Eingabe und die Erfassung der Leistung und Fehler-streams Recht.