2012-03-09 7 views
5

Supongamos que tengo una cadena llamada very_long_string cuyo contenido deseo enviar a la salida estándar. Pero dado que la cadena es muy larga, quiero usar less para visualizar el texto en la terminal. Cuando uso¿Cómo utilizar los programas de buscapersonas Unix como `less` de Ruby?

`less #{very_long_string}` 

consigo File not found mensaje de error y si uso:

`less <<< #{very_long_string}` 

me sale unexpected redirection mensaje de error.

Entonces, ¿cómo usar less desde el interior de Ruby?

+0

Ha intentado 'long_string | menos'? – alex

+0

@alex ¿Cómo hacerlo desde dentro de ruby? Pero gracias puedo probar '\' echo # {long_string} | less \ ''. – Ankit

+0

@alex Y eso tampoco parece funcionar, todavía me da error de archivo no encontrado – Ankit

Respuesta

15

Puede abrir una tubería y alimentar a su cadena a menos a través de su stdin.

IO.popen("less", "w") { |f| f.puts very_long_string } 

(Suponiendo very_long_string es la variable que contiene la cadena.)

Ver: archivos http://www.ruby-doc.org/core-1.8.7/IO.html#method-c-popen

+0

Hay más de lo que parece. Tengo dos problemas: 1) presionar 'q' para salir menos produce un error EPIPE que da como resultado que se abandone una pila de aspecto desagradable. Es fácil atraparlo con un rescate. 2) presionando^C antes de que toda la salida se haya enviado a menos. menos básicamente solo come el^C. El código ruby ​​obtiene una interrupción pero no puedo entender cómo salir con gracia y todavía tengo menos, también salgo con gracia y vuelvo a configurar el TTY en su configuración original. – pedz

1

Aunque less puede leer el texto de su forma natural es la de utilizarlo como el último comando en una tubería. Por lo que un ajuste natural sería:

shell-command-1 | shell-command-2 | shell-command-3 | less 

En el intérprete de comandos:

echo tanto va la gatta al lardo che ci lascia lo zampino|less 

.so puede probar esto en IRB:

`echo tanto va la gatta al lardo che ci lascia lo zampino|less` 

pero se prefiere utilizar:

your_string = "tanto va la gatta al lardo che ci lascia lo zampino" 
`echo "#{your_string}"|less` 

Si tiene tiempo, lea this SO pregunta.

Para una demostración completa de la utilización de las llamadas al sistema en rubí ver este GIST: https://gist.github.com/4069

+0

Realmente lo usé, pero no pasó nada. Sin errores, sin mostrar nada. La secuencia de comandos simplemente regresó. Sin embargo, IO.popen() como lo sugirió @ user1252434 funcionó muy bien. – Ankit

+0

Me alegro de que haya resuelto. – microspino

0

Un simple truco:

require 'tempfile' 
f = Tempfile.new('less') 
f.write(long_string) 

system("less #{f.path}") 
Cuestiones relacionadas