432 Stimmen

Ruby, Unterschied zwischen exec, system und %x() oder Backticks

Was ist der Unterschied zwischen den folgenden Ruby-Methoden?

exec , system y %x() o Backticks

Ich weiß, dass sie verwendet werden, um Terminalbefehle programmatisch über Ruby auszuführen, aber ich würde gerne wissen, warum es drei verschiedene Möglichkeiten gibt, dies zu tun.

480voto

Konrad Reiche Punkte 26304

System

En system Methode ruft ein Systemprogramm auf. Sie müssen den Befehl als String-Argument für diese Methode angeben. Zum Beispiel:

>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true

Das aufgerufene Programm verwendet die aktuelle STDIN , STDOUT y STDERR Objekte Ihres Ruby-Programms. Der eigentliche Rückgabewert ist nämlich entweder true , false o nil . In diesem Beispiel wurde das Datum über das IO-Objekt von STDIN . Die Methode gibt zurück true wenn der Prozess mit einem Status von Null beendet wurde, false wenn der Prozess mit einem Status ungleich Null beendet wurde und nil wenn die Ausführung fehlgeschlagen ist.

Seit Ruby 2.6 ist die Übergabe von exception: true löst eine Ausnahme aus, anstatt eine false o nil :

>> system('invalid')
=> nil

>> system('invalid', exception: true)
Traceback (most recent call last):
...
Errno::ENOENT (No such file or directory - invalid)

Ein weiterer Nebeneffekt ist, dass die globale Variable $? wird auf eine Process::Status Objekt. Dieses Objekt enthält Informationen über den Aufruf selbst, einschließlich der Prozesskennung (PID) des aufgerufenen Prozesses und des Exit-Status.

>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>

Backticks

Backticks (``) ein Systemprogramm aufrufen und dessen Ausgabe zurückgeben. Im Gegensatz zum ersten Ansatz wird der Befehl nicht durch eine Zeichenkette angegeben, sondern durch ein Backtick-Paar.

>> `date`
=> Wed Sep 4 22:22:51 CEST 2013   

Die globale Variable $? wird auch durch die Backticks gesetzt. Mit Backticks können Sie auch die String-Interpolation nutzen.

%x()

Verwendung von %x ist eine Alternative zum Backtick-Stil. Sie gibt auch die Ausgabe zurück. Wie seine Verwandten %w y %q (u.a.) ist jedes Begrenzungszeichen ausreichend, solange die Begrenzungszeichen im Klammerstil übereinstimmen. Dies bedeutet %x(date) , %x{date} y %x-date- sind alle Synonyme. Wie Backticks %x kann die Interpolation von Zeichenketten nutzen.

Ausführung

Durch die Verwendung von Kernel#exec wird der aktuelle Prozess (Ihr Ruby-Skript) durch den Prozess ersetzt, der durch exec . Die Methode kann eine Zeichenkette als Argument annehmen. In diesem Fall wird die Zeichenkette einer Shell-Expansion unterzogen. Wenn mehr als ein Argument verwendet wird, wird das erste zur Ausführung eines Programms verwendet und die folgenden werden als Argumente für das aufzurufende Programm bereitgestellt.

Öffnen3.popen3

Manchmal werden die erforderlichen Informationen in die Standardeingabe oder den Standardfehler geschrieben, und Sie müssen auch diese kontrollieren können. Hier Open3.popen3 ist sehr nützlich:

require 'open3'

Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
   pid = thread.pid
   puts stdout.read.chomp
end

337voto

Ian Punkte 10246

Hier ist ein Flussdiagramm, das auf 本答 . Siehe auch, mit script um ein Terminal zu emulieren .

enter image description here

120voto

William Pursell Punkte 188248

Sie tun unterschiedliche Dinge. exec ersetzt den aktuellen Prozess durch den neuen Prozess und kehrt nie zurück . system einen anderen Prozess aufruft und gibt seinen Exit-Wert zurück zum aktuellen Prozess. Die Verwendung von Backticks ruft einen anderen Prozess auf und gibt die Ausgabe dieses Prozesses auf den aktuellen Prozess.

0voto

Tara Punkte 59

In meinem Fall hat das funktioniert.

output = `nmap localhost`

Diese speichert die Ausgabe in der Variablen, also ist die Antwort `` anstelle von system.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X