Interpolierter Shell Befehl

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:

  1. Der Befehl kann als String zugewiesen werden (oder sogar ohne String Notation, sprich ohne Anführungsstriche)
  2. Führt den Befehl in einer subshell aus
  3. Ist eine blockierende Operation (wartet, bis die Operation beendet wurde)
  4. Gibt das Ergebnis der Operation zurück
  5. Wenn der Kind Prozess einen Fehler verursacht, wird die Exception ausgelöst
  6. 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