Ruby, diferencia entre exec, sistema y% x() o Backticks
(3)
Aquí hay un diagrama de flujo basado en esta respuesta . Véase también, usando script
para emular un terminal .
¿Cuál es la diferencia entre los siguientes métodos de Ruby?
exec
, system
y %x()
o Backticks
Sé que se utilizan para ejecutar comandos de terminal mediante programación a través de Ruby, pero me gustaría saber por qué hay tres formas diferentes de hacerlo.
Ellos hacen cosas diferentes. exec
reemplaza el proceso actual con el nuevo proceso y nunca regresa . system
invoca otro proceso y devuelve su valor de salida al proceso actual. El uso de backticks invoca otro proceso y devuelve la salida de ese proceso al proceso actual.
sistema
El método del system
llama a un programa del sistema. Debe proporcionar el comando como un argumento de cadena a este método. Por ejemplo:
>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true
El programa invocado usará los objetos STDIN
, STDOUT
y STDERR
STDOUT
de su programa 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 devolverá 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 objeto Process::Status
. 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
backticks (``) llama a un programa del sistema y devuelve su salida. A diferencia de la primera aproximación, el comando no se proporciona a través de una cadena, sino que se coloca dentro de un par de backticks.
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013
La variable global $?
Se establece a través de los backticks, también. Con backticks también puedes hacer uso de interpolación de cadenas.
%X()
Usar %x
es una alternativa al estilo backticks. También devolverá la salida. Al igual que sus parientes %w
y %q
(entre otros), cualquier delimitador será suficiente siempre que los delimitadores de estilo corchete coincidan. Esto significa que %x(date)
, %x{date}
y %x-date-
son todos sinónimos. Como backticks %x
puede hacer uso de la interpolación de cadenas.
exec
Al utilizar exec el proceso actual (su script Ruby) se reemplaza con el proceso invocado a través de exec
. El método puede tomar una cadena como argumento. En este caso, la cadena estará sujeta a la expansión de 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 también necesita controlarlos. Aquí Open3.popen3
es útil:
require ''open3''
Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end