¿Cuál es la diferencia entre los siguientes métodos de Ruby?
exec, systemY %x()o acentos abiertos
Sé que se usan 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.

sh.Respuestas:
sistema
El
systemmétodo llama a un programa del sistema. Debe proporcionar el comando como un argumento de cadena para este método. Por ejemplo:El programa invocado utilizará la corriente
STDIN,STDOUTySTDERRlos objetos de su programa de Ruby. De hecho, el valor de retorno real estrue,falseonil. En el ejemplo, la fecha se imprimió a través del objeto IO deSTDIN. El método regresarátruesi el proceso salió con un estado cero,falsesi el proceso salió con un estado distinto de cero ynilsi la ejecución falló.Otro efecto secundario es que la variable global
$?se establece en unProcess::Statusobjeto. Este objeto contendrá información sobre la llamada en sí, incluido el identificador de proceso (PID) del proceso invocado y el estado de salida.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.
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
%xes una alternativa al estilo de backticks. También devolverá la salida. Al igual que sus parientes%wy%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%xpueden hacer uso de la interpolación de cadenas.ejecutivo
Al usar
Kernel#execel proceso actual (su script Ruby) se reemplaza con el proceso invocadoexec. 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.popen3viene útil:fuente
STDIN,STDOUT,STDERR, consideranOpen3.popen3su lugar; por ejemplo, consulte stackoverflow.com/a/10922097/258662Aquí hay un diagrama de flujo basado en esta respuesta . Ver también, usar
scriptpara emular un terminal .fuente
Ellos hacen cosas diferentes.
execreemplaza el proceso actual con el nuevo proceso y nunca regresa .systeminvoca 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.fuente