¿Cuál es la diferencia entre los siguientes métodos de Ruby?
exec
, system
Y %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
system
mé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
,STDOUT
ySTDERR
los objetos de su programa de Ruby. De hecho, el valor de retorno real estrue
,false
onil
. En el ejemplo, la fecha se imprimió a través del objeto IO deSTDIN
. El método regresarátrue
si el proceso salió con un estado cero,false
si el proceso salió con un estado distinto de cero ynil
si la ejecución falló.Otro efecto secundario es que la variable global
$?
se establece en unProcess::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.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
%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 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.popen3
viene útil:fuente
STDIN
,STDOUT
,STDERR
, consideranOpen3.popen3
su lugar; por ejemplo, consulte stackoverflow.com/a/10922097/258662Aquí hay un diagrama de flujo basado en esta respuesta . Ver también, usar
script
para emular un terminal .fuente
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.fuente