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 行編輯器。

相關內容