bash 如何检索终端上写入的内容(无需按 Enter 键)?

bash 如何检索终端上写入的内容(无需按 Enter 键)?

假设该命令正在运行,我在运行ping时在终端上输入一些内容。ping

现在,当ping终止并bash重新获得控制权时,bash将在终端上打印我在ping运行时键入的内容。这是一个屏幕截图,显示了我的意思:

在此输入图像描述

如何bash获得这些信息?我确信它没有从 中获取它stdin,因为当我输入 时"I typed this while ping was running",我没有按Enter(所以stdin是空的)。

答案1

重击做过从标准输入 (stdin)(即终端)获取输入。

终端可以是以下两个之一模式:生的或者煮熟的(也称为“字符模式”和“行模式”,术语“raw”和“cooked”主要在 Unix 世界中使用)(“cooked”一词是作为双关语引入的,与“raw”相对) )。在原始模式下,终端立即将输入传输到应用程序。在cooked模式下,终端读取整行并提供(非常原始的)行编辑机制,并且仅当用户按下 时才将数据传输到应用程序Enter

终端以煮熟模式启动。想要更多地控制输入的应用程序(例如 bash),在等待用户键入命令时将终端设置为原始模式。

答案2

我相信终端缓冲通过键盘接收到的每一行文本,这样任何具有附加到终端设备文件的文件描述符(即 fd0)的程序都不会看到该行中的任何文本,直到终端“发送”它- 当您按下 时会发生这种情况 Enter
(shell 的行编辑器如何解决这个问题 - 我不确定,但他们肯定会在您点击之前获取文本Enter

此外,当 shell 启动子进程(在本例中ping)时,它会在子进程运行时进入挂起/ waiting 状态,因此即使终端没有保留其中的文本,shell 也会忽略它,假设它是用于子进程。

所以你在屏幕上看到的文字是因为终端正在显示它,但没有程序捕获它并对其执行任何操作,直到子进程退出 - 并且 shell“唤醒” - 然后文本被发送到 shell 行编辑器。虽然我认为不一定所有终端去做。

相关内容