Terminal

防止終端提示被程序輸出覆蓋

  • May 14, 2020

假設我在終端中執行這樣的命令:

~$ echo 'sleep 2; echo "hello!"' | sh

然後開始輸入下一行。兩秒鐘後,“你好!\n”將被插入到我正在寫的任何內容中。我知道有一個解決方法(按向上然後向下刷新提示),但是在沒有歷史記錄的其他系統上——例如,通過 telnet 使用 MUD——這是不可能的。

有人知道將標準輸入與標準輸出分開的 ncurses 應用程序或終端仿真器嗎?這似乎很容易在 ncurses 中製作,您只需要使用一些聰明的 dup2s,但在我製作它之前,我想知道是否有人以前做過。

也歡迎針對主要問題的任何其他解決方案。

這並不像聽起來那麼容易改變。它與終端煮熟與原始模式以及是否啟用回顯有關。

當終端處於熟模式(預設)時,核心讀取作為輸入的所有內容並使用基本的行編輯功能進行處理,包括立即回顯普通文本,處理擦除單個字元和整個字元的擦除和終止字元分別是目前行的內容,以及其他一些內容。當您按下輸入鍵時,文本行僅實際出現在終端的輸入中。在您按下 Enter 之前的整個過程中,一切都完全發生在核心內部,並且終端上執行的任何程序都不會收到單個字節,因此前台應用程序甚至不知道使用者正在輸入任何內容。在 tty 上執行的程序無法抑制此回顯,即使它只是因為回顯出現在不合時宜的時間(例如與輸出混合),因為這樣的程序甚至不知道輸入正在發生。

您可以將終端設置為原始模式而不使用回顯來抑制此操作(stty raw或使用 termios),但隨後您將完全失去核心的行編輯功能 - 這意味著例如您無法通過按Ctrl-u並重新開始來糾正錯字。更重要的是,使用任何依賴於核心熟處理的程序(基本上任何不使用 readline 或 ncurses 的程序)都會遇到很多麻煩,因為在這些程序上你會完全盲目地打字!哦,還有:如果沒有終端處理,您將失去核心對中斷和掛起作業控制快捷方式的攔截(預設情況下分別為Ctrl-cCtrl- z)。

引用自:https://unix.stackexchange.com/questions/208633