2012-03-09 70 views
5

假設我有一個名爲very_long_string的字符串,其內容我想發送到標準輸出。但由於字符串很長,我想使用less在終端上顯示文本。當我使用如何使用像Ruby的`less`這樣的Unix pager程序?

`less #{very_long_string}` 

我得到File not found錯誤消息,如果我使用:

`less <<< #{very_long_string}` 

我得到unexpected redirection錯誤消息。

那麼,如何在Ruby中使用less

+0

你試過'long_string |少'? – alex 2012-03-09 15:15:17

+0

@alex如何從紅寶石內部做到這一點?但是,謝謝我可以嘗試'\'echo#{long_string} | less \''。 – Ankit 2012-03-09 15:17:16

+0

@alex而且這似乎並沒有工作,我仍然得到文件找不到錯誤消息 – Ankit 2012-03-09 15:20:52

回答

15

你可以打開一個管道,並通過它的stdin將你的字符串送到較少的地方。

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

(假設very_long_string是可變的牽着你的字符串)。

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

+0

這不僅僅是滿足眼睛。我有兩個問題:1)點擊'q'退出少產生一個EPIPE錯誤,導致一個討厭的堆棧被甩出。這很容易發現救援機會。 2)在所有輸出發送到較少之前,擊中^ C。較少基本上只吃^ C。紅寶石代碼確實得到了一箇中斷,但我無法弄清楚如何正常退出,並且仍然沒有那麼優雅地退出,並將TTY設置回原來的設置。 – pedz 2016-11-11 17:15:08

1

雖然less可以閱讀文本文件的天作之合是用它作爲管道的最後一個命令。所以天作之合將是:

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

在shell提示符:

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

..所以你可以在IRB試試這個:

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

但我會更喜歡使用:

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

如果您有時間閱讀this SO問題。

對於使用系統調用的徹底展示在Ruby中看到這個要點: https://gist.github.com/4069

+0

我確實使用過它,但沒有發生任何事情。沒有錯誤,沒有任何顯示。腳本只是返回。但是,@ user1252434建議的IO.popen()工作得很好。 – Ankit 2012-03-09 15:49:33

+0

很高興你解決了。 – microspino 2012-03-09 15:55:06

0

一個簡單的黑客:

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

system("less #{f.path}") 
相關問題