Bash CLI:更改后恢复之前输入的命令

run*_*ace 10 command-line bash

这种奇怪的(对我来说)行为多年来一直困扰着我。

在 bash 中,可以按向上键来引用上一个命令。假设我不小心按了Ctrl+ W,我想恢复之前的命令,但它似乎消失了。如果我清除该命令并重试,它仍然从历史记录中消失。

例如

  1. 假设我运行以下命令:

    $ ls /etc/sudoers.d/
    10_at-export  010_pi-nopasswd  010_proxy  README
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在按Up

    $ ls /etc/sudoers.d/
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在按Up然后Backspace几次:

    $ ls
    
    Run Code Online (Sandbox Code Playgroud)

现在如何ls /etc/sudoers.d/从这里返回?

对于长命令,我使用鼠标复制并粘贴上述命令#mouseisuncool。

raj*_*raj 10

一旦你弄乱了命令,删除它的其余部分,然后按Enter(所有这些都不需要使用向上或向下箭头)shell 将“执行”空行并在命令历史记录中创建一个新条目,而不是更改旧的,所以在此之后,您将能够使用向上箭头正常返回到已删除的命令。

尝试这个:

  1. 键入nosuchcommand并按Enter
  2. 当然,您会收到“命令未找到”消息;)
  3. 按向上箭头返回nosuchcommand命令并以您想要的任何方式删除它
  4. 只需按Enter。shell 将“执行”空行并出现另一个提示符。
  5. 按向上箭头,nosuchcommand命令会重新出现:)


van*_*ium 7

您实际上通过向上箭头所做的是直接编辑您的命令历史记录。因此,调用命令ls /etc/sudoers.d/并编辑它可以有效地更改该历史记录项。

要有效地“复制”命令并修改副本而不是历史项,请使用鼠标(...不,开玩笑!!)

默认 bash 功能

要有效地“复制”命令并修改副本而不是历史记录项,请使用反向搜索功能,即“ Ctrl+ r”。例如,键入两个或三个字母,sud直到看到该命令。如果历史记录中有多个匹配项,则您可以可以继续按Ctrl+r直到出现您想要的命令,或者再输入几个字母。

看到命令后,按Ctrl+aHomeLeft箭头键会将命令“复制”到提示符中。执行后,这将成为另一个历史项目。

强大提示:模糊查找器

高级用户可以安装模糊查找。Ctrl它包括对+默认行为的替换R,其中历史记录中的匹配命令出现在列表中。Enter在所需的行上根据提示“复制”它。


Pet*_*des 7

Alt-rEsc+r是您要查找的内容的 readline 键绑定。
bash 手册页的 readline 部分

revert-line(Mr)
撤消对此行所做的所有更改。这就像执行undo命令足够多次以使行返回到其初始状态。

即使您使用向上或向下箭头离开历史记录项目然后再次返回,也可以使用此功能。

(M 代表 Meta。在正常的键盘/X11/终端设置中,您的 Alt 键将充当终端的“元”。或者等效地,Esc如果您的终端不支持,您可以在按下另一个键之前手动按下以应用相同的功能设置得不够好,无法让 alt 工作。)

undo命令绑定到Ctrl- /,它将撤消先前的击键。

对于 control-w ( (Cw)),您也可以使用- ( )unix-word-rubout粘贴回数据,就像在 Emacs 中一样。类似地,对于(M-Rubout,在普通键盘/终端/X11 配置上是 Alt+Backspace 或 Escape+Backspace),被杀死的文本会进入杀死环,您可以在其中将其拉出。(在 Cy 后,My 在杀戮环中循环,这样你仍然可以获得较旧的杀戮。)Ctrlyyankbackward-kill-word

有许多方便的行编辑命令,但所有可用命令的列表非常庞大且令人难以抗拒。我绝对不认识他们中的大多数人。在大多数情况下,能够使用 ctrl+箭头或 Mb / Mf 一次将光标移动整个“单词”,并杀死向前/向后的单词(和猛拉)就足够了。(我在另一个答案中提到了其中一些


如果我按取消并重试,它仍然从历史记录中消失。

Ctrl如果你按下+ ,Bash 就不会这样工作了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
Run Code Online (Sandbox Code Playgroud)

此外,运行缩短的命令将恢复历史更改并创建一个新条目。

(您还.inputrc可以使用一个设置,revert-all-at-newline它可以使提交命令恢复对所有其他历史记录条目的所有更改。)