Bash确实从其标准输入 (stdin) 中获取了您的输入,即终端。
终端可以处于两种模式中的一种:raw或cooked(也称为“字符模式”和“行模式”,术语“raw”和“cooked”在 Unix 世界中最常用)(“cooked”这个词被引入作为双关语,与“原始”相反)。在原始模式下,终端立即将输入传输到应用程序。在熟模式下,终端读取整行并提供(非常原始的)行编辑机制,只有在用户按下 时才将数据传输到应用程序Enter。
终端以熟模式启动。希望对输入进行更多控制的应用程序(例如 bash)在等待用户键入命令时将终端设置为原始模式。
我相信终端缓冲通过键盘接收到的每一行文本,这样任何具有附加到终端设备文件的文件描述符(即 fd0)的程序都不会看到该行中的任何文本,直到终端“发送”它- 当您按下 时会发生这种情况 Enter。
(shell 的行编辑器如何解决这个问题 - 我不确定,但他们肯定会在您点击之前获取文本Enter)
此外,当 shell 启动子进程(在本例中ping
)时,它会在子进程运行时进入挂起/ wait
ing 状态,因此即使终端没有保留其中的文本,shell 也会忽略它,假设它是用于子进程。
因此,您在屏幕上看到的文本是因为终端正在显示它,但没有程序捕获它并对其执行任何操作,直到子进程退出 - 并且 shell“唤醒” - 然后文本被发送到shell 行编辑器。尽管我不认为所有终端都必须这样做。