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