¿Hay alguna forma de ejecutar comandos de línea de comandos a través de Ruby? Estoy tratando de crear un pequeño programa Ruby que marcaría y recibiría / enviaría a través de programas de línea de comando como 'pantalla', 'rcsz', etc.
Sería genial si pudiera vincular todo esto con Ruby (backend MySQL, etc.)
Respuestas:
Si. Hay varias formas:
a. Utilice
%x
o '' ':Estos métodos devolverán stdout y redirigirán stderr al archivo del programa.
si. Utilizar
system
:Este método regresa
true
si el comando fue exitoso. Redirige toda la salida a la del programa.C. Utilizar
exec
:Eso reemplaza el proceso actual con el creado por el comando.
re. (ruby 1.9) uso
spawn
:Este método no espera a que el proceso salga y devuelve el PID.
mi. Utilizar
IO.popen
:Este método devolverá un
IO
objeto que repite la entrada / salida de los nuevos procesos. También es actualmente la única forma que conozco de dar entrada al programa.F. Usar
Open3
(en 1.9.2 y posteriores)Open3
tiene varias otras funciones para obtener acceso explícito a los dos flujos de salida. Es similar a popen, pero te da acceso a stderr.fuente
io = IO.popen 'cat > out.log', 'r+'
; escribe las salidas del comando en "out.log"FileUtils
[ ruby-doc.org/stdlib-1.9.3/libdoc/fileutils/rdoc/FileUtils.html] ?Hay algunas formas de ejecutar comandos del sistema en Ruby.
Pero si realmente necesita realizar la entrada y salida con stdin / stdout del comando, probablemente querrá ver el
IO::popen
método, que ofrece específicamente esa facilidad.fuente
fuente
Sí, esto es ciertamente factible, pero el método de implementación difiere dependiendo de si el programa de "línea de comando" en cuestión opera en "Pantalla completa" o en modo de línea de comando. Los programas escritos para la línea de comando tienden a leer STDIN y escribir en STDOUT. Estos se pueden llamar directamente dentro de Ruby usando los métodos estándar de comillas invertidas y / o llamadas al sistema / exec.
Si el programa funciona en modo "Pantalla completa" como screen o vi, entonces el enfoque tiene que ser diferente. Para programas como este, debe buscar una implementación Ruby de la biblioteca "espera". Esto le permitirá crear un script de lo que espera ver en la pantalla y qué enviar cuando vea aparecer esas cadenas en particular en la pantalla.
Es poco probable que este sea el mejor enfoque y probablemente debería mirar lo que está tratando de lograr y encontrar la biblioteca / gema relevante para hacerlo en lugar de intentar automatizar una aplicación de pantalla completa existente. Como ejemplo, " Necesito ayuda con las comunicaciones del puerto serie en Ruby " trata de las comunicaciones del puerto serie, un precursor para marcar si eso es lo que desea lograr utilizando los programas específicos que mencionó.
fuente
El método más utilizado que está usando
Open3
aquí es mi versión editada de código del código anterior con algunas correcciones:fuente