Ruby als scripting Sprache bietet unterschiedlichste Möglichkeiten einen Shell Befehl abzusetzen. Eine davon ist die interpolierte Prozent Notation. Grundsätzlich ist das ‘%’ Literal gekennzeichnet durch:
- Der Befehl kann als String zugewiesen werden (oder sogar ohne String Notation, sprich ohne Anführungsstriche)
- Führt den Befehl in einer subshell aus
- Ist eine blockierende Operation (wartet, bis die Operation beendet wurde)
- Gibt das Ergebnis der Operation zurück
- Wenn der Kind Prozess einen Fehler verursacht, wird die Exception ausgelöst
- Der Fehlerstatus (Exception) ist in “$?” verfügbar. Es gibt ein Process::Status Objekt zurück (entspricht einem qualifizierten Exit Status)
Ein paar Beispiele.
Zunächst sei angenommen es gibt eine Datei script.rb. Die kann mit dem Shell Befehl ‘find’ gefunden werden:
%x{find *.rb} # => script.rb
Wenn der Dateiname dynamisch interpoliert werden soll:
name = 'script'
%x{find #{name}.rb} # => script.rb
Das UNIX Shell Kommando ‘date’ gibt die Systemzeit zurück. Die kann in Ruby dann in ein Time Objekt geparst werden:
Time.parse %x{date}.chop # => 2014-10-10 02:23:10 +0200
Oder einfach mal beim Schlafen beobachten:
(0..4).each { |seconds| puts %x{ sleep #{seconds} && 'date'} }
Ein unbekannter Befehl löst einen Fehler aus, der auch zurückgegeben wird:
%x{foo} # => Errno::ENOENT: No such file or directory - foo
und die kann dann sogar weiterverarbeit werden:
%x{foo}
$? # => #<Process::Status: pid 4357 exit 127>
$?.exitstatus # => 127