Was ist der Unterschied zwischen den folgenden Ruby-Methoden?
exec
, system
Und %x()
oder Backticks
Ich weiß, dass sie verwendet werden, um Terminalbefehle programmgesteuert über Ruby auszuführen, aber ich möchte wissen, warum es drei verschiedene Möglichkeiten gibt, dies zu tun.
sh
.Antworten:
System
Die
system
Methode ruft ein Systemprogramm auf. Sie müssen den Befehl als Zeichenfolgenargument für diese Methode angeben. Zum Beispiel:Das aufgerufene Programm wird die aktuelle verwenden
STDIN
,STDOUT
undSTDERR
Objekte Ihrer Ruby - Programm. In der Tat ist der tatsächliche Rückgabewert entwedertrue
,false
odernil
. Im Beispiel wurde das Datum über das E / A-Objekt von gedrucktSTDIN
. Die Methode wird zurückgegeben,true
wenn der Prozess mit einem Nullstatus beendet wurde,false
wenn der Prozess mit einem Status ungleich Null beendet wurde undnil
wenn die Ausführung fehlgeschlagen ist.Ein weiterer Nebeneffekt ist, dass die globale Variable
$?
auf einProcess::Status
Objekt festgelegt ist. Dieses Objekt enthält Informationen zum Aufruf selbst, einschließlich der Prozesskennung (PID) des aufgerufenen Prozesses und des Beendigungsstatus.Backticks
Backticks (``) rufen ein Systemprogramm auf und geben dessen Ausgabe zurück. Im Gegensatz zum ersten Ansatz wird der Befehl nicht über eine Zeichenfolge bereitgestellt, sondern durch Einfügen in ein Backtick-Paar.
Die globale Variable
$?
wird auch über die Backticks festgelegt. Mit Backticks können Sie auch die String-Interpolation verwenden.% x ()
Die Verwendung
%x
ist eine Alternative zum Backticks-Stil. Es wird auch die Ausgabe zurückgeben. Wie seine Verwandten%w
und%q
(unter anderem) wird jedes Trennzeichen ausreichen, solange Trennzeichen im Klammerstil übereinstimmen. Dieses Mittel%x(date)
,%x{date}
und%x-date-
sind alle Synonyme. Wie Backticks%x
können die String-Interpolation nutzen.exec
Durch die Nutzung
Kernel#exec
des aktuellen Prozesses (Ihr Ruby-Skript) wird der durch aufgerufene Prozess ersetztexec
. Die Methode kann eine Zeichenfolge als Argument verwenden. In diesem Fall wird die Zeichenfolge einer Shell-Erweiterung unterzogen. Wenn Sie mehr als ein Argument verwenden, wird das erste zum Ausführen eines Programms verwendet, und die folgenden Argumente werden als Argumente für das aufzurufende Programm bereitgestellt.Open3.popen3
Manchmal werden die erforderlichen Informationen in Standardeingaben oder Standardfehler geschrieben, und Sie müssen auch die Kontrolle darüber erlangen. Hier ist
Open3.popen3
praktisch:quelle
STDIN
,STDOUT
,STDERR
, betrachtenOpen3.popen3
statt; zB siehe stackoverflow.com/a/10922097/258662Hier ist ein Flussdiagramm, das auf dieser Antwort basiert . Siehe auch Verwenden
script
zum Emulieren eines Terminals .quelle
Sie machen verschiedene Dinge.
exec
Ersetzt den aktuellen Prozess durch den neuen Prozess und kehrt nie zurück .system
ruft einen anderen Prozess auf und gibt seinen Exit-Wert an den aktuellen Prozess zurück. Die Verwendung von Backticks ruft einen anderen Prozess auf und gibt die Ausgabe dieses Prozesses an den aktuellen Prozess zurück.quelle