sistema
El system
método llama a un programa del sistema. Debe proporcionar el comando como un argumento de cadena para este método. Por ejemplo:
>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true
El programa invocado utilizará la corriente STDIN
, STDOUT
y STDERR
los objetos de su programa de Ruby. De hecho, el valor de retorno real es true
, false
o nil
. En el ejemplo, la fecha se imprimió a través del objeto IO de STDIN
. El método regresará true
si el proceso salió con un estado cero, false
si el proceso salió con un estado distinto de cero y nil
si la ejecución falló.
Otro efecto secundario es que la variable global $?
se establece en un Process::Status
objeto. Este objeto contendrá información sobre la llamada en sí, incluido el identificador de proceso (PID) del proceso invocado y el estado de salida.
>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>
Backticks
Las teclas de retroceso (``) llaman a un programa del sistema y devuelven su salida. A diferencia del primer enfoque, el comando no se proporciona a través de una cadena, sino poniéndolo dentro de un par de backticks.
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013
La variable global también $?
se establece a través de los backticks. Con los backticks también puede hacer uso de la interpolación de cadenas.
%X()
Usar %x
es una alternativa al estilo de backticks. También devolverá la salida. Al igual que sus parientes %w
y %q
(entre otros), cualquier delimitador será suficiente siempre que coincidan los delimitadores de estilo de soporte. Esto significa %x(date)
, %x{date}
y %x-date-
son todos sinónimos. Al igual que los backticks %x
pueden hacer uso de la interpolación de cadenas.
ejecutivo
Al usar Kernel#exec
el proceso actual (su script Ruby) se reemplaza con el proceso invocado exec
. El método puede tomar una cadena como argumento. En este caso, la cadena estará sujeta a la expansión del shell. Cuando se usa más de un argumento, el primero se usa para ejecutar un programa y los siguientes se proporcionan como argumentos para el programa que se va a invocar.
Open3.popen3
A veces, la información requerida se escribe en la entrada estándar o en el error estándar y usted también necesita controlarlos. Aquí Open3.popen3
viene útil:
require 'open3'
Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end