这种对我来说很奇怪的行为已经困扰了我好几年。
在 bash 中,可以按向上键来引用上一个命令。假设我意外地按了Ctrl+ 键W,我想恢复上一个命令,但它似乎消失了。如果我清除该命令并重试,它仍然会从历史记录中消失。
例如
假设我运行以下命令:
$ ls /etc/sudoers.d/ 10_at-export 010_pi-nopasswd 010_proxy README
现在按Up:
$ ls /etc/sudoers.d/
现在按Up几次Backspace:
$ ls
现在如何ls /etc/sudoers.d/
从这里返回?
对于长命令,我使用鼠标复制并粘贴上述命令#mouseisuncool。
答案1
一旦您弄乱了命令,请删除其余部分并按下Enter(所有这些都无需使用向上或向下箭头)shell 将“执行”空行并在命令历史记录中创建一个新条目而不是更改旧条目,因此在此之后,您将能够使用向上箭头正常返回到已删除的命令。
尝试这个:
- 键入
nosuchcommand
并按下Enter - 当然,您会收到“未找到命令”的消息;)
- 按向上箭头返回
nosuchcommand
命令并以任何您想要的方式删除它 - 只要按下Enter。shell 就会“执行”空行,然后会出现另一个提示符。
- 按向上箭头,
nosuchcommand
命令会重新出现:)
答案2
Alt-r或Esc+r是 readline 的键绑定,正是您要查找的内容。
在bash 手册页的 readline 部分:
revert-line
(先生)
撤消对此行所做的所有更改。这就像执行undo
命令足够多次以将该行恢复到其初始状态。
即使您已通过向上或向下箭头离开历史记录项然后再次返回该历史记录项,您也可以使用此功能。
(M 代表 Meta。在正常的键盘 / X11 / 终端设置中,您的 Alt 键将作为终端的“元”键。或者,Esc如果您的终端设置不够好,无法让 alt 工作,您可以在按下另一个键之前手动按下该键以应用相同的功能。)
该命令与-undo
绑定,它将撤消前一次击键。Ctrl/
对于 control-w ( (Cw)),您也可以像在 Emacs 中一样使用- ( )unix-word-rubout
粘贴回数据。同样,对于(M-Rubout,在普通键盘/终端/X11 配置上是 Alt+Backspace 或 Escape+Backspace),被杀死的文本会进入 kill ring,您可以在其中将其拉出。(在 Cy 之后,My 会在 kill ring 中循环,因此您仍然可以获取较早的被杀死文本。)Ctrlyyank
backward-kill-word
有许多方便的行编辑命令,但所有可用命令的列表非常长,让人应接不暇。我肯定不了解其中的大部分。大多数情况下,能够使用 ctrl+arrow 或 Mb/Mf 一次移动整个“单词”的光标,并删除向前/向后的单词(和拉出)就足够了。(我在另一个答案中提到了一些)
如果我按“取消”并重试,它仍然会从历史记录中消失。
如果你按下Ctrl+C
$ echo foo
foo
$ echo ^C # up arrow, C-w, C-c
$ echo foo # up arrow recalls the pristine command
foo
$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu) # I'm on Arch Linux
此外,运行缩短的命令将恢复历史更改并创建新的条目。
(你也.inputrc
可以使用一个设置revert-all-at-newline
,使提交命令恢复全部更改所有其他历史记录条目。
答案3
您通过向上箭头所做的实际上是直接编辑命令历史记录。因此,撤回命令ls /etc/sudoers.d/
并对其进行编辑实际上会更改该历史记录项。
要有效地“复制”命令并修改副本而不是历史记录项,请使用鼠标(...不,开玩笑!!)
默认 bash 功能
要有效地“复制”命令并修改副本而不是历史记录项,请使用反向搜索功能,即“ Ctrl+ ” r。键入两个或三个字母,例如,sud
直到看到该命令。如果历史记录中有多个匹配项,您可以继续按Ctrl+r直到出现所需的命令,或者再键入几个字母。
看到命令后,按Ctrl+a或Home或Left箭头键会将命令“复制”到提示符中。执行后,该命令将成为另一个历史记录项。
强力提示:模糊查找器
Ctrl高级用户可以安装模糊查找。它包括默认行为+的替代R,其中来自历史记录的匹配命令出现在列表中。Enter在所需行上“复制”它在提示符下。
答案4
逐步撤消:我有时会犯错误,只想修复最后一个或最后几个更改。最近我发现了ctrl+ x,ctrl+ u。这会逐步执行“撤消”,直到您到达原始命令或空行(如果您从头开始)。