【发布时间】:2017-10-21 09:56:39
【问题描述】:
假设ping 命令正在运行,我在终端上键入一些内容,而ping 仍在运行。
现在当ping 终止并且bash 重新获得控制权时,bash 将在终端上打印我在ping 运行时键入的内容。这是一个显示我的意思的屏幕截图:
bash 是如何获得这些信息的?我确定它不是从stdin 得到的,因为当我输入"I typed this while ping was running" 时,我没有按Enter(所以stdin 是空的)。
因此,这些数据必须存储在“击键缓冲区”中,并且bash 从该缓冲区中读取。
我的问题是,bash 如何从这个缓冲区中读取数据(它调用了什么函数...)?
【问题讨论】:
-
Bash 没有
read来自任何东西。您的 ttyechos您的击键(就像您键入命令时一样)ping正在 subshell 中运行,并且当它完成时,并将控制权返回给父母,您输入的内容就在您面前。如果您在ping期间键入echo foo并点击return,那么您将在空的PS1提示上方的行上看到foo。 (要清楚,在 输入缓冲区 和returnbash 确实从该缓冲区读取您的命令,但这与您输入后看到的内容无关) -
@David C. Rankin 是的,tty 回显了我的击键,但是回显的击键与
ping的输出混合在一起。 "paul@paul-laptop:~$" 之后存在的 "I typed this while ping was running" 由bash(tty i> 只回显我的击键一次而不是两次)。 -
您得到本地回显,并且该命令仍然在您的
PS1提示符前面,直到您点击enter,尽管它也在ping期间回显到终端(您必须这样做)一个ping -c x shomehost而不是ping somehost然后ctrl+c这将清空输入缓冲区。) -
@David C. Rankin 如果
bash不是做回显的人,那么为什么当我使用sh时,没有发生第二次回显? -
@DavidC.Rankin 回答 1),因为
readline把它放在那里。