2012-03-09 4 views
5

Supponiamo di avere una stringa denominata very_long_string di cui voglio inviare il contenuto allo standard output. Ma poiché la stringa è molto lunga, voglio usare less per visualizzare il testo sul terminale. Quando usoCome utilizzare i programmi di cercapersone Unix come `less` da Ruby?

`less #{very_long_string}` 

ricevo File not found messaggio di errore, e se uso:

`less <<< #{very_long_string}` 

ricevo unexpected redirection messaggio di errore.

Quindi, come utilizzare less dall'interno di Ruby?

+0

Hai provato 'long_string | di meno? – alex

+0

@alex Come si fa dall'interno del rubino? Ma grazie, posso provare '\' echo # {long_string} | less \ ''. – Ankit

+0

@alex E anche quello non sembra funzionare, ho ancora il file non trovato messaggio di errore – Ankit

risposta

15

È possibile aprire una pipe e alimentare la stringa con meno tramite il suo stdin.

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

(Supponendo very_long_string è la variabile che tiene la stringa.)

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

+0

C'è di più a questo che soddisfa l'occhio. Due problemi che ho: 1) premendo 'q' per uscire di meno produce un errore EPIPE che si traduce in uno stack sgradevole che viene scaricato. È facile da prendere con un salvataggio. 2) premendo^C prima che tutto l'output sia stato inviato a un valore inferiore. meno fondamentalmente mangia solo il^C. Il codice ruby ​​ottiene un interrupt, ma non riesco a capire come uscire con grazia e avere meno anche uscire con garbo e riportare il TTY alle impostazioni originali. – pedz

1

Anche se less in grado di leggere il testo sua forma naturale è quello di utilizzarlo come l'ultimo comando in un tubo. Quindi, una scelta naturale sarebbe:

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

Al prompt della shell:

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

..Così si può provare questo in IRB:

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

ma si preferisce usare:

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

Se avete tempo leggere this domanda SO.

Per una dimostrazione completa di usare chiamate di sistema in Ruby vedere questo succo: https://gist.github.com/4069

+0

In realtà l'ho usato, ma non è successo nulla. Nessun errore, nessuna visualizzazione nulla. La sceneggiatura è semplicemente tornata. Tuttavia, IO.popen() come suggerito da @ user1252434 ha funzionato molto bene. – Ankit

+0

Felice di averlo risolto. – microspino

0

Un semplice trucco:

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

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