如何在Ruby中使用类unix分页程序(如`less`)?

5
假设我有一个名为very_long_string的字符串,我想将其内容发送到标准输出。但是由于该字符串非常长,我希望使用less在终端上显示文本。当我使用 less 命令时,可以这么做:
`less #{very_long_string}`

我得到了“文件未找到”的错误消息,如果我使用以下方式:

`less <<< #{very_long_string}`

我收到了“意外重定向”错误提示。

那么,如何在Ruby中使用less


你试过使用 long_string | less 吗? - alex
@alex 如何在 Ruby 中实现此操作?但是谢谢,我可以尝试 \echo #{long_string}|less``。 - Ankit
@alex 而且似乎也不起作用,我仍然收到“文件未找到”错误消息。 - Ankit
3个回答

17

2
这个问题比看起来的要复杂。我有两个问题:1)按“q”退出less会产生EPIPE错误,导致一个难看的堆栈被转储出来。这很容易通过救援来解决。2)在所有输出都发送到less之前按下^C。 less基本上只是吃掉了^C。 Ruby代码确实会收到中断,但我无法想出如何优雅地退出并仍然使less也优雅地退出并将TTY设置回其原始设置。 - pedz

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 的 Stack Overflow 问题。
对于在 Ruby 中使用系统调用的全面演示,请参阅此代码片段:https://gist.github.com/4069

我确实使用了它,但是什么也没有发生。没有错误,没有显示任何东西。脚本只是返回了。然而,正如@user1252434建议的那样,IO.popen()非常有效。 - Ankit

1
一个简单的技巧:
require 'tempfile'
f = Tempfile.new('less')
f.write(long_string)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接