No estoy seguro si esto tiene sentido, pero estoy pensando si hay una manera de suprimir el resultado mostrado para un comando cuando se ejecuta usando el método system
en ruby? Quiero decir que debería simplemente dar como resultado verdadero o falso a STDOUT y no a la salida del comando. Lo que creo es que solo se puede hacer si el comando se puede ejecutar en silencio y no desde el método system
. ¿Puede alguien proporcionar un poco más de conocimiento?Suprimir la salida de un comando ejecutado usando el método 'system' mientras se ejecuta en un script de ruby
Respuesta
Después de llamar a system
el código de salida está en la variable $?
especial por lo que si useradd
devuelve valores diferentes para indicar si el usuario se ha añadido correctamente (por ejemplo, 0 para el éxito) entonces usted puede hacer lo siguiente:
system('useradd xx > /dev/null')
if $? == 0
puts 'added'
else
puts 'failed'
end
donde la redirección a /dev/null
suprimirá la salida.
Alternativamente, si el programa que se está llamando no utiliza su código de salida para indicar el éxito o el fracaso, puede utilizar los trazos y buscar una subcadena particular en la salida, p.
if `useradd xx`.include? 'success'
puts 'it worked'
else
puts 'failed to add user'
end
También puede utilizar acentos abiertos o% x
sí, pero no podré usarlo como condición para ejecutar algunas afirmaciones que puedo hacer cuando uso 'system' – kilari
Eso tiene muy poco sentido, así que tal vez deba publicar un ejemplo real. –
Así que escriba un condicional diferente que en realidad analiza el resultado y podría ser una mejor idea que la que tiene ahora. –
Como una adición, me ha sorprendido un par de veces cuando yo he usado acentos abiertos y vio la salida "deslizamiento" del pasado mi variables al ejecutar secuencias de comandos desde la línea de comandos.
Invariablemente, el problema es que el texto que estoy viendo proviene en realidad de stderr
en lugar de stdout
. Entonces, para cambiar ese texto a stdout también, recuerde agregar 2>&1
al comando que está tratando de ejecutar.
Espero que sea útil para alguien. Me acabo de perder veinte minutos reaprendizaje esta lección :)
IO.popen
Ésta es otra buena opción:
IO.popen(['echo', 'a']) do |f|
f.read == "a\n" or raise
end
$?.exitstatus == 0 or raise
Nada va a obtener una salida a su salida estándar.
TODO hace 'IO.popen ('cmd'). Close' ¿funciona también? http://stackoverflow.com/questions/1217351/io-popen-how-to-wait-for-process-to-finish#comment42139826_1236075 –
Esto debería funcionar
system ls, STDOUT:'/dev/null'
Este es un argumento inválido, por lo que no hay idea de dónde viene esto. – Julik
me enfrentaba a esta pregunta, así ...
Tenga en cuenta que con rubí system
llamadas, el comando UNIX que está intentando el uso puede ofrecer una opción "silenciosa", anulando la necesidad de suprimir por completo la salida del terminal.
Por ejemplo:
system 'curl -s "your_params_here"'
suprimirá la salida que normalmente acompaña a una llamada rizo.
Si desea aprovechar la forma variadica de Kernel.system, que da un paso al costado de los muchos problemas de cotización con shells, puede usar el mismo options which Kernel.spawn accepts.
TL; DR - Uso :out => File::NULL
para silenciar la salida de Kernel.system
Argumentos con caracteres especiales (espacios, etc.) puede causar problemas con la cáscara:
irb(main):001:0> filename_with_spaces = "foo bar.txt"
=> "foo bar.txt"
irb(main):002:0> system "ls -l #{filename_with_spaces}"
ls: bar.txt: No such file or directory
ls: foo: No such file or directory
=> false
Así que si están interpolando variables en una llamada al sistema, es más seguro proporcionar los argumentos por separado:
irb(main):003:0> system "ls", "-l", filename_with_spaces
-rw-r--r-- 1 nobody nobody 9 Feb 1 16:53 foo bar.txt
=> true
Pero ahora tenemos un problema si queremos ocultar el resultado.
irb(main):004:0> system "ls", "-l", filename_with_spaces, "> /dev/null"
ls: > /dev/null: No such file or directory
-rw-r--r-- 1 nobody nobody 9 Feb 1 16:53 foo bar.txt
=> false
Podríamos cerrar la salida estándar utilizando la opción :out => :close
:
irb(main):005:0> system "ls", "-l", filename_with_spaces, :out => :close
=> true
Sin embargo, esto podría causar problemas con ciertos comandos que puede tratar de conectar a la salida estándar. sistemas
irb(main):007:0> system "echo", "hi there", :out => File::NULL
=> true
Esta es la respuesta correcta. –
De esta respuesta pude deducir ': err =>' también. ¿Hay algo que signifique tanto 'out:' como ': err', entonces no tengo que escribir': out => File :: NULL,: err => File :: NULL'? – user137369
Si observa la documentación de [kernel # spawn] (http://ruby-doc.org/core-2.3.0/Kernel.html#method-i-spawn), encontrará que puede hacer esto ' [: out,: err] => File :: NULL', así como muchas otras cosas. – Steve
- definen
null_device
, se está operando dependent::irb(main):006:0> system "echo", "hi there", :out => :close echo: write: Bad file descriptor => false
Para solucionar esto, podemos volver a redirigir nuestra producción, utilizando
File::NULL
permanecer portátil ventanas 7 y más nuevos usannul
, mientras que * nix sistemas utiliza/dev/null
- ejecución del comando
- redirección es estándar y la salida de error a
null_device
- a continuación, utilizar el código de salida, o el método de acento grave como mentioned por @mikej para determinar la salida
de la siguiente manera:
null_device = Gem.win_platform? ? "/nul" : "/dev/null"
do method
system "run command 1>#{null_device} 2>#{null_device} "
p ($? == 0)
end
- 1. ¿Cómo detener PHP mientras se aplica un comando de terminal usando system() o passthru()?
- 2. Mostrando progreso mientras se ejecuta un comando de sistema() en Perl
- 3. Barra de carga mientras se ejecuta el script
- 4. Mensajes de eco mientras el script php aún se ejecuta
- 5. obtener la salida del comando shell_exec como comando ejecuta
- 6. ¿Cómo ejecuto un script externo mientras capturo tanto el código de salida como el de salida en Perl?
- 7. Dentro de un script bash, ¿cómo obtener PID de un programa ejecutado cuando se utiliza el comando eval?
- 8. Cómo transmitir la salida de un ScriptBlock ejecutado mediante programación?
- 9. Cómo comprobar si un comando bash se ha ejecutado correctamente
- 10. Devuelve la salida del comando "sistema" en Ruby?
- 11. ejecutar la salida de un script como un comando de bash independiente
- 12. Cómo suprimir la salida
- 13. Suprimir el sistema ("ping") de salida en C++
- 14. Recopilación de la salida de un comando externo usando OCaml
- 15. Cómo ejecutar y capturar stdout del comando externo en Ruby usando system() sin escape de shell?
- 16. ¿Para cambiar el directorio dentro de un script de ruby?
- 17. Ejecutando un comando desde Ruby mostrando y capturando la salida
- 18. Caracteres Unicode en un script de Ruby?
- 19. C: ¿Ejecuta un comando del sistema y obtiene salida?
- 20. Cómo devolver un código de salida de un script de Powershell solo cuando se ejecuta de forma no interactiva
- 21. Comprobar si un comando se ha ejecutado correctamente
- 22. ¿Cómo suprimir la salida de la consola en Python?
- 23. ¿La fuente de C# se ejecuta como un script?
- 24. ¿Cómo se ejecuta exactamente un script PHP?
- 25. ¿Cómo se ejecuta un comando en un sistema remoto en una secuencia de comandos de BASH?
- 26. org.hsqldb.jdbcDriver ClassNotFoundException mientras se ejecuta la prueba junit para un método
- 27. Salida de Ruby en la misma línea que la salida anterior
- 28. Archivo por lotes: suprimir la salida de error de comando cuando se usa en un ciclo for
- 29. Imprimir el comando ejecutado para el subproceso de Python. Popen
- 30. Salida adicional ninguna mientras se imprime un argumento de línea de comando
comprobando que el estado de salida parece funcionar perfecto. Gracias. – kilari
Esto solo no suprimirá 'stderr'. Debería usar este 'sistema ('useradd xx>/dev/null 2> & 1')' – Dex
'system' también devuelve' true' o 'false' y me gusta especialmente depender de esos valores simples. Los valores devueltos no se ven afectados por la redirección '>/dev/null 2> & 1'. – Ikon