1
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 是否是终端,但这无助于我找出

  1. 是否连接了终端,或者
  2. 如何重定向/管道/munge可能不是STDIN的终端文件输入

更新:好的,我做了一些挖掘,看起来我一直在寻找神奇的/dev/tty. 希望有人能告诉我如何弄乱它。

更新:提炼的问题:我本质上是否需要在pty需要翻译其事件的寻呼机的特定实例上构建和运行?听起来这会很痛苦,因为我需要拥有所有这些流程管理和东西。IO:Pty:Easy不过看起来很有希望。

4

1 回答 1

0

如果你这样做

$ lsof -p <pid-of-less>

你会在底部看到类似

less    30875 user    3r   CHR    5,0      0t0    1037 /dev/tty

它向您展示了如何less打开控制终端/dev/tty来读取命令。

于 2013-04-16T03:48:40.197 回答