如何將預輸入應用於 bash 歷史搜尋 (Ctrl-R)?
語境
在 bash 中提前輸入:好
當 bash shell 忙(初始化、執行命令)時,可以在下一個提示出現之前鍵入。
如果 shell 啟動了一個程序,該程序將擷取密鑰,但如果沒有執行任何程序或程序沒有擷取輸入,則在出現提示後將哪種類型插入到 shell 中。
例如:鍵入
sleep 5
,按 Enter,然後鍵入ls
並按 Enter。ls
將在睡眠完成後執行。在現實生活中,ls
會被cp
,rsync
或許多其他程序所取代。這是一個典型的Typeahead功能,當您提前知道要輸入什麼時,它可以節省大量時間。它也非常好,因為它允許複製粘貼多個命令並讓它們按順序執行。
實際案例包括 shell 需要時間初始化的情況。可能是電腦由於某種原因變慢了,或者 shell 的網路連結速度較慢,等等。
bash 中的歷史搜尋:很好
在 bash 提示符下,可以鍵入
Ctrl-R
以搜尋歷史記錄。當重用一些舊的命令行,甚至是命令行序列時,這是一個非常寶貴的時間節省。按
Ctrl-R
,鍵入幾個典型的命令字元進行搜尋,按Ctrl-O
需要多次按以從那裡重播記錄的命令。歷史搜尋中的提前輸入:如何?
但是,有一個限制。我經常使用上面的順序,發現如果我
Ctrl-R ls
在 shell 提示實際出現之前鍵入 eg,Ctrl-R
則忽略該部分但ls
顯示該部分。最終效果是在鍵入之前必須等待 shell 提示出現
Ctrl-R
,從而節省了部分時間。問題
即使在提前輸入的情況下,有沒有辦法獲得
Ctrl-R
榮譽?
您的
Ctrl
-r
正在被基於核心的終端 cookie 行處理引擎攔截。執行時
sleep
,終端處於熟化模式,這意味著基於核心的 tty 行編輯器正在工作。tty 行編輯器支持基本的命令行編輯。擦除鍵(通常設置為Ctrl
-h
(退格鍵)或Del
)和終止鍵(通常是Ctrl-U
)是可以在此模式下使用的最著名的特殊編輯鍵。這個行編輯器很有用:它允許既不使用 readline 也不使用 curses 的互動式實用程序從終端讀取完整的輸入行,同時允許使用者進行打字更正。但是在此模式下還有另一個特殊鍵處於活動狀態。
stty -a
您可以在名稱下的輸出中看到它以及其他關鍵設置,rprnt
其預設設置是……你猜對了……Ctrl
-r
。該鍵的作用是重新繪製目前命令行,以防它由於其他終端輸出而損壞或錯位。為避免這種情況,您可以使用 禁用該功能
stty rprnt undef
。就我個人而言,我習慣了
Ctrl
-r
被解釋為重繪命令,每次我嘗試這樣做時我都會感到驚訝bash
,它會做一些不同的事情!