根據GNU 文檔, 有一個字符VREPRINT
、 或rprnt
,它應該重新列印 shell 的行編輯器的輸入緩衝區。如果在您鍵入另一個命令時後台進程之類的東西已寫入 PTY 並且輸出散佈在您的輸入中,這會很有幫助。然而我嘗試實際使用,似乎沒有什麼效果。我做了以下事情:
sh
在 Dockerhub 的最新映像上執行會話alpine
。- 用於將字元
stty
綁定rprnt
到^N
。 - 輸入一些內容
- 從單獨的會話寫入第一個會話的 PTY。
- 嘗試按 ctrl-N 重新列印我的輸入
我期望它刷新我的輸入並刪除寫入的輸出。然而,沒有任何效果。我的行編輯器中仍然有輸出混亂。我已經驗證了這一點,icanon
並iexten
已在該 PTY 上進行了設定。
答案1
我假設您的 shellbash
或其他具有全功能行編輯功能的 shell。
這些 shell 在等待您鍵入命令時,將 tty 模式設為原始模式而不是規範模式,因此該rprnt
設定不適用於它們。
命令列工具stty
不會報告它,因為這些 shell 在行編輯期間與運行請求的外部程式(例如本身)期間來回切換設定stty
。您可以透過stty -a < /dev/pts/[this-terminal's-number]
在出現提示時從另一個終端運行來確認這一點。
選擇一個可以執行此操作的程序不是具有成熟的行編輯功能,例如cat
或dash
類似功能。您會發現stty rprnt ^N
預先發出並且按下^N
確實會重新列印給定的行。至少我已經驗證過並且它對我有用。
對於具有強大行編輯功能的 shell,您必須查閱給定 shell 的文檔(或如果是bash
庫readline
)以了解如何重新列印提示或如何配置其熱鍵。