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
不过看起来很有希望。