【发布时间】:2013-04-08 08:18:00
【问题描述】:
echo "abc" | less
less 通过 STDIN 接收 4 个字节“a”、“b”、“c”、“\x0A”,并以自己的特殊方式(使用交替屏幕模式等)向用户显示“abc” .
然后用户在键盘上键入“n”,通过在终端左下角用反色写“未找到模式(按 RETURN)”来减少响应。我们还看到它在左侧打印了一系列波浪号。
为了知道尝试搜索其搜索缓冲区中的内容,显然不必接收“n”字符的输入。
它是从哪里得到“n”的?我在终端中输入了它,但是终端是否连接到 less 的 STDIN?如果是这样,难道不只是将“n”卡在显示缓冲区中吗?好吧,它可以分辨出来,但如果我运行 echo "abc" | tail -f 则不能。
我该如何处理这个文件描述符?我正在构建一个 perl 程序来将鼠标转义码转换为键码,这样我就可以制作一个特殊的管道或包装的命令/程序,它可以像寻呼机一样工作,但可以是鼠标交互的。但是如果 less 的 STDIN 是输入文件而不是终端本身,我不知道如何进入那里。我真的希望我可以通过我的映射程序管理交互式终端输出。
我也知道可以检查程序的 STDIN 是否是终端,但这并不能帮助我找出答案
- 是否连接了终端,或者
- 如何重定向/管道/munge 可能不是 STDIN 的终端文件输入
更新:好的,我做了一些挖掘,看起来我一直在寻找神奇的/dev/tty。希望有人能告诉我如何弄乱它。
更新:精炼的问题:我是否需要在需要翻译其事件的寻呼机的特定实例上构建和运行pty?听起来这会很痛苦,因为我需要拥有所有这些流程管理和东西。 IO:Pty:Easy 看起来很有希望。
【问题讨论】:
-
如何弄乱它?它是一个特殊的文件,但它确实像一个文件:您打开它并可以读取和写入它。不过,如果您想要原始数据,您可能需要与
termios做一些有趣的事情。 -
您可能想查看 CPAN 上的模块 IO:Tty 和 IO::Pty
-
@icktoofay 你是说我的程序可以
open/dev/tty,然后把翻译后的东西写回它,就可以了?似乎一个 pty(我告诉它在我的 pty 上生成less)更有意义。否则我看不到我的程序如何知道/dev/tty是正确的tty。如果我打开了两个交互式终端,就会有不止一个tty... -
@StevenLu:不,我是说
less只是打开/dev/tty并将其视为普通文件。在你编辑之前,我以为你只是想写一个像less这样的程序,而不是less周围的代理。 -
我希望能够在 STDIN 上使用它。我想如果我可以将文件输入作为参数中的文件填充到 less 中,也许使用
<()那么 STDIN 可能是终端,在这种情况下我可以使用管道。然后将其包装在脚本中。