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

pau*_*aul 5 bash terminal input tty

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

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

在此处输入图片说明

bash这个信息是怎么得到的?我确信它不是从 得到的stdin,因为当我输入时"I typed this while ping was running",我没有按下Enter(所以stdin是空的)。

Gil*_*il' 5

Bash确实从其标准输入 (stdin) 中获取了您的输入,即终端。

终端可以处于两种模式中的一种:rawcooked(也称为“字符模式”和“行模式”,术语“raw”和“cooked”在 Unix 世界中最常用)(“cooked”这个词被引入作为双关语,与“原始”相反)。在原始模式下,终端立即将输入传输到应用程序。在熟模式下,终端读取整行并提供(非常原始的)行编辑机制,只有在用户按下 时才将数据传输到应用程序Enter

终端以熟模式启动。希望对输入进行更多控制的应用程序(例如 bash)在等待用户键入命令时将终端设置为原始模式。

  • @MiniMax 将终端设备视为一对管道。每个管道在一个方向上传送数据:从硬件/仿真器到应用程序(称为输入)或从应用程序到硬件/仿真器(称为输出)。来自 ping 的数据进入输出管道。它不会与用户输入的内容混合,通过输入管道并在相反的方向。 (2认同)

the*_*fog 0

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

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

因此,您在屏幕上看到的文本是因为终端正在显示它,但没有程序捕获它并对其执行任何操作,直到子进程退出 - 并且 shell“唤醒” - 然后文本被发送到shell 行编辑器。尽管我不认为所有终端都必须这样做。