语境
在 bash 中提前输入:很好
当 bash shell 繁忙时(初始化、运行命令),可以在出现下一个提示之前键入。
如果 shell 启动了一个程序,该程序将捕获按键,但如果没有程序运行或者该程序没有捕获输入,则在出现提示后,将在 shell 中插入键入的内容。
例如:键入sleep 5
,按 Enter,然后键入ls
并按 Enter。 ls
将在睡眠完成后运行。在现实生活中,ls
会被cp
或rsync
许多其他程序取代。这是一个典型的提前输入当您提前知道要输入什么内容时,这可以节省大量时间。
它也非常好,因为它允许复制粘贴多个命令并让它们按顺序运行。
实际用例包括 shell 需要时间初始化的情况。可能是计算机由于任何原因速度变慢,或者 shell 处于缓慢的网络链接等。
bash 中的历史搜索:很好
在 bash 提示符下,可以键入内容Ctrl-R
来搜索历史记录。
当重用一些旧的命令行,甚至命令行序列时,这可以节省宝贵的时间。按Ctrl-R
,键入要搜索的命令的几个典型字符,Ctrl-O
根据需要多次按以从那里重播记录的命令。
历史搜索中的提前输入:如何?
但有一个限制。我经常使用上面的序列,发现如果我Ctrl-R ls
在 shell 提示符实际出现之前输入eg,该Ctrl-R
部分会被忽略,但ls
会显示该部分。
最终的结果是,在键入之前必须等待 shell 提示符出现Ctrl-R
,从而浪费了部分节省的时间。
问题
有没有办法Ctrl-R
即使在预先输入的情况下也能获得荣誉?
答案1
您的Ctrl-r正在被基于内核的终端 cookied 行处理引擎拦截。
运行时sleep
,终端处于烘焙模式,这意味着基于内核的 tty 行编辑器正在工作。 tty 行编辑器支持基本的命令行编辑。擦除键(通常设置为Ctrl- h(退格)或Del)和终止键(通常为Ctrl-U)是可在此模式下使用的最著名的特殊编辑键。这个行编辑器很有用:它可以让既不使用 readline 也不使用curses 的交互式实用程序从终端读取完整的输入行,同时允许用户进行打字更正。
但在此模式下还有另一个处于活动状态的特殊键。您可以在stty -a
名称下的输出中看到它以及其他关键设置rprnt
,其默认设置是...您猜对了... Ctrl- r。该键的功能是重新绘制当前命令行,以防它由于其他终端输出而损坏或未对齐。
为了避免这种情况,您可以使用 禁用该功能stty rprnt undef
。
就我个人而言,我习惯了Ctrl-r被解释为重绘命令,每次我尝试这样做时我都会感到惊讶,bash
它会做一些不同的事情!