我试图确定系统如何将字符打印到标准输入——也就是说,它如何打印用户可以删除的字符,以及如果用户点击“Enter”,哪些字符被视为输入。
我碰巧在使用 C,但如果解决方案依赖于语言,我会感到非常惊讶。
感谢您的任何见解!: D
我试图确定系统如何将字符打印到标准输入——也就是说,它如何打印用户可以删除的字符,以及如果用户点击“Enter”,哪些字符被视为输入。
我碰巧在使用 C,但如果解决方案依赖于语言,我会感到非常惊讶。
感谢您的任何见解!: D
正如 iny 所说,bash 使用 readline 作为输入。源代码可在此处获得,并且有一个名为 complete.c 的文件。
要回答您的问题,我认为它们实际上并未打印到标准输入中。Readline 包含用户正在编辑的行内容的某种缓冲区,完成打印到此。当用户按下回车键时,缓冲区的内容被发送到任何程序想要读取一行,并且在 bash 的情况下,传递到标准输入。(Readline 不这样做 - 使用 readline 的其他程序可能只是将值存储到字符串中以供以后使用。)
有几个人指出 bash 使用 readline,这是真的,但我认为您真正要问的是它如何能够在您按 Enter 之前查看您输入的内容。
答案是 ttys(即:终端)可以切换到“原始模式”,终端的输入处理被禁用,然后你会看到每个输入的字符。这也会禁用输入字符的自动回显。
这是一个通过 readline 实现制表符完成的 C 代码片段:
它使用 readline 库来处理输入,readline 提供历史记录和完成。
要实际实现完成,需要访问键盘输入处理。完成必须能够修改它使用的缓冲区。之后,它只是查看当前输入并检查找到了哪些完成。实际的完成逻辑可以以多种方式工作。