ruby exec

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