Quiero tratar con la entrada de línea de comando en Ruby:
> cat input.txt | myprog.rb
> myprog.rb < input.txt
> myprog.rb arg1 arg2 arg3 ...
¿Cuál es la mejor manera de hacerlo? En particular, quiero tratar con STDIN en blanco, y espero una solución elegante.
#!/usr/bin/env ruby
STDIN.read.split("\n").each do |a|
puts a
end
ARGV.each do |b|
puts b
end
myprog.rb
: elinput.txt
archivo está adjunto a stdin ; el caparazón maneja esto por ti.Respuestas:
A continuación hay algunas cosas que encontré en mi colección de Ruby oscuro.
Entonces, en Ruby, una implementación simple sin campanas del comando Unix
cat
sería:ARGF
es tu amigo cuando se trata de entrada; Es un archivo virtual que obtiene todas las entradas de los archivos con nombre o todo de STDIN.Gracias a Dios, no obtuvimos el operador de diamantes en Ruby, pero lo conseguimos
ARGF
como reemplazo. Aunque oscuro, en realidad resulta ser útil. Considere este programa, que antecede los encabezados de copyright en el lugar (gracias a otro Perlism-i
) a cada archivo mencionado en la línea de comandos:Crédito a:
fuente
idx
será el "número de línea" en el archivo virtual que concatena todas las entradas, en lugar del número de línea para cada archivo individual.#!/usr/bin/env ruby -i
línea no funciona en Linux: stackoverflow.com/q/4303128/735926Ruby proporciona otra forma de manejar STDIN: la bandera -n. Trata todo su programa como si estuviera dentro de un bucle sobre STDIN (incluidos los archivos pasados como argumentos de línea de comando). Consulte, por ejemplo, el siguiente script de 1 línea:
fuente
#!/usr/bin/env ruby -n
no funcionará, ya que "ruby -n" se pasará a / usr / bin / env como único argumento. Vea esta respuesta para más detalles. El guión será trabajar si se ejecuta conruby -n script.rb
forma explícita.No estoy muy seguro de lo que necesita, pero usaría algo como esto:
Tenga en cuenta que debido a que la matriz ARGV está vacía antes
gets
, Ruby no intentará interpretar el argumento como un archivo de texto del cual leer (comportamiento heredado de Perl).Si stdin está vacío o no hay argumentos, no se imprime nada.
Pocos casos de prueba:
fuente
¿Algo así quizás?
Ejemplo:
fuente
Esto está inspirado en Perl:
fuente
Rápido y simple:
STDIN.gets.chomp == 'YES'
fuente
Agregaré eso para usar
ARGF
con parámetros, debe borrarARGV
antes de llamarARGF.each
. Esto se debe aARGF
que tratará cualquier cosaARGV
como un nombre de archivo y leerá líneas desde allí primero.Aquí hay un ejemplo de implementación 'tee':
fuente
Hago algo como esto:
fuente
Parece que la mayoría de las respuestas están asumiendo que los argumentos son nombres de archivos que contienen contenido para ser incluido en el stdin. Debajo de todo se trata solo como argumentos. Si STDIN es del TTY, entonces se ignora.
Los argumentos o stdin pueden estar vacíos o tener datos.
fuente