run - Ejecutando comandos de línea de comando dentro del script Ruby
how to run a ruby script (5)
El método más usado es Usar Open3
aquí está mi versión editada de código del código anterior con algunas correcciones:
require ''open3''
puts"Enter the command for execution"
some_command=gets
stdout,stderr,status = Open3.capture3(some_command)
STDERR.puts stderr
if status.success?
puts stdout
else
STDERR.puts "ERRRR"
end
¿Hay alguna manera de ejecutar comandos de línea de comandos a través de Ruby? Intento crear un pequeño programa de Ruby que marque y reciba / envíe a través de programas de línea de comando como ''pantalla'', ''rcsz'', etc.
Sería genial si pudiera unir todo esto con Ruby (back-end de MySQL, etc.)
Hay algunas formas de ejecutar comandos del sistema en Ruby.
irb(main):003:0> `date /t` # surround with backticks
=> "Thu 07/01/2010 /n"
irb(main):004:0> system("date /t") # system command (returns true/false)
Thu 07/01/2010
=> true
irb(main):005:0> %x{date /t} # %x{} wrapper
=> "Thu 07/01/2010 /n"
Pero si necesita realizar la entrada y la salida con el comando stdin / stdout, probablemente quiera mirar el método IO::popen
, que específicamente ofrece esa función.
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 modo línea de comando. Los programas escritos para la línea de comando tienden a leer STDIN y escribir en STDOUT. Se pueden llamar directamente dentro de Ruby utilizando los métodos estándar de retroceso y / o las llamadas al sistema / ejecución.
Si el programa opera en modo "Pantalla completa" como pantalla o vi, el enfoque debe ser diferente. Para programas como este, debe buscar una implementación Ruby de la biblioteca "esperar". Esto le permitirá programar lo que espera ver en la pantalla y lo que debe enviar cuando vea esas cadenas en particular en la pantalla.
Es poco probable que sea el mejor enfoque y probablemente deba analizar lo que está tratando de lograr y encontrar la biblioteca / gema relevante para hacerlo en lugar de tratar de automatizar una aplicación de pantalla completa existente. Como ejemplo " Necesito ayuda con las comunicaciones de puerto serie en Ruby " se ocupa de las comunicaciones de puerto serie, un precursor para marcar si eso es lo que quiere lograr usando los programas específicos que mencionó.
Sí. Hay varias formas:
a. Use %x
o ''`'':
%x(echo hi) #=> "hi/n"
%x(echo hi >&2) #=> "" (prints ''hi'' to stderr)
`echo hi` #=> "hi/n"
`echo hi >&2` #=> "" (prints ''hi'' to stderr)
Estos métodos devolverán stdout y redirigirán stderr al programa.
segundo. Usar system
:
system ''echo hi'' #=> true (prints ''hi'')
system ''echo hi >&2'' #=> true (prints ''hi'' to stderr)
system ''exit 1'' #=> nil
Este método devuelve true
si el comando fue exitoso. Redirige todo el resultado al programa.
do. Use exec
:
fork { exec ''sleep 60'' } # you see a new process in top, "sleep", but no extra ruby process.
exec ''echo hi'' # prints ''hi''
# the code will never get here.
Eso reemplaza el proceso actual con el creado por el comando.
re. (ruby 1.9) usa spawn
:
spawn ''sleep 1; echo one'' #=> 430
spawn ''echo two'' #=> 431
sleep 2
# This program will print "two/none".
Este método no espera a que el proceso salga y devuelve el PID.
mi. Use IO.popen
:
io = IO.popen ''cat'', ''r+''
$stdout = io
puts ''hi''
$stdout = IO.new 0
p io.read(1)
io.close
# prints ''"h"''.
Este método devolverá un objeto IO
que representa la entrada / salida de los nuevos procesos. También es actualmente la única forma que conozco de dar la entrada del programa.
F. Use Open3
(en 1.9.2 y posterior)
require ''open3''
stdout,stderr,status = Open3.capture3(some_command)
STDERR.puts stderr
if status.successful?
puts stdout
else
STDERR.puts "OH NO!"
end
Open3
tiene otras funciones para obtener acceso explícito a las dos secuencias de salida. Es similar a popen, pero le da acceso a stderr.
folder = "/"
list_all_files = "ls -al #{folder}"
output = `#{list_all_files}`
puts output