2012-03-09 13 views
5

Załóżmy, że mam ciąg o nazwie very_long_string, którego zawartość chcę wysłać na standardowe wyjście. Ale ponieważ ciąg jest bardzo długi, chcę użyć less, aby wyświetlić tekst na terminalu. Gdy używamJak używać programów pagerowych Unix takich jak `less` z Ruby?

`less #{very_long_string}` 

uzyskać File not found komunikat o błędzie, a jeśli używam:

`less <<< #{very_long_string}` 

unexpected redirection otrzymuję komunikat o błędzie.

A więc, jak używać less od wewnątrz Ruby?

+0

Czy próbowałeś 'long_string | mniej "? – alex

+0

@alex Jak to zrobić z wewnątrz rubinu? Ale dzięki, mogę spróbować '\' echo # {long_string} | less \ ''. – Ankit

+0

@alex I to też nie działa, nadal dostaję komunikat o błędzie nie znaleziono pliku – Ankit

Odpowiedz

15

Możesz otworzyć fajkę i podać mniejszy ciąg przez jego wejście standardowe.

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

(Zakładając very_long_string jest zmienna trzymając łańcuch.)

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

+0

Jest więcej do tego niż na pierwszy rzut oka. Mam dwie kwestie: 1) naciśnięcie "q", aby opuścić mniej, powoduje błąd EPIPE, który powoduje odrzucenie paskudnie wyglądającego stosu. Łatwo złapać ratunek. 2) trafienie^C zanim wszystkie dane wyjściowe zostaną wysłane do mniej. mniej w zasadzie po prostu zjada^C. Kod ruby ​​przerywa, ale nie mogę wymyślić, jak z wdziękiem wyjść i nadal mieć mniej, a także wyjść z wdziękiem i przywrócić TTY do swoich pierwotnych ustawień. – pedz

1

Chociaż less może odczytać pliki tekstowe jego naturalnym wyborem jest użycie go jako ostatniego polecenia w rurze. Więc naturalnym wyborem będzie:

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

Do poleceń powłoki:

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

..so można spróbować w ten IRB:

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

ale wolę używać:

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

Jeśli masz czas przeczytaj this Pytanie SO.

do dokładnego wykazania za pomocą wywołań systemowych w Ruby zobaczyć ten sens: https://gist.github.com/4069

+0

Właściwie to wykorzystałem, ale nic się nie stało. Brak błędów, brak wyświetlania nic. Skrypt po prostu wrócił. Jednak funkcja IO.popen() zgodnie z sugestią użytkownika @ user1252434 działała bardzo dobrze. – Ankit

+0

Cieszę się, że rozwiązany. – microspino

0

Prosty Hack:

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

system("less #{f.path}") 
Powiązane problemy