AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1396884
Accepted
run_the_race
run_the_race
Asked: 2022-03-11 02:35:29 +0800 CST2022-03-11 02:35:29 +0800 CST 2022-03-11 02:35:29 +0800 CST

Bash CLI:更改后恢复以前键入的命令

  • 772

这种奇怪的(对我来说)行为已经让我迷惑了多年。

在 bash 中,可以按向上来引用上一个命令。说然后我不小心按Ctrl+W并且我希望恢复以前的命令,但它似乎已经消失了。如果我清除命令,然后重试,它仍然从历史记录中消失。

例如

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

    $ ls /etc/sudoers.d/
    10_at-export  010_pi-nopasswd  010_proxy  README
    
  2. 现在按Up:

    $ ls /etc/sudoers.d/
    
  3. 现在按Up几次Backspace:

    $ ls
    

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

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

command-line
  • 6 6 个回答
  • 1192 Views

6 个回答

  • Voted
  1. raj
    2022-03-11T09:23:46+08:002022-03-11T09:23:46+08:00

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

    尝试这个:

    1. 键入nosuchcommand并按下Enter
    2. 当然,您会收到“找不到命令”消息;)
    3. 按向上箭头返回nosuchcommand命令并以您想要的任何方式将其删除
    4. 只需按Enter。shell 将“执行”空行并出现另一个提示。
    5. 按向上箭头,nosuchcommand命令重新出现:)
    • 10
  2. vanadium
    2022-03-11T09:12:52+08:002022-03-11T09:12:52+08:00

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

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

    默认 bash 功能

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

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

    电源提示:模糊查找器

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

    • 7
  3. Best Answer
    Peter Cordes
    2022-03-12T01:39:51+08:002022-03-12T01:39:51+08:00

    Alt-r或Esc+r是您正在寻找的内容的 readline 键绑定。
    在bash 手册页的 readline 部分:

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

    即使您已经向上或向下箭头离开历史项目然后再次返回它,您也可以使用它。

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

    该undo命令绑定到Ctrl- /,它将撤消上一次击键。

    对于 control-w ( unix-word-rubout(Cw)),您也可以使用Ctrl- y( yank) 将数据粘贴回来,就像在 Emacs 中一样。类似地,对于backward-kill-word(M-Rubout,在普通键盘/终端/X11 配置上是 Alt+Backspace 或 Escape+Backspace),被终止的文本进入终止环,您可以在其中拉出它。(在 Cy 之后,My 循环通过杀戮环,因此您仍然可以进行较旧的杀戮。)

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


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

    如果你按下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
    

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

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

    • 6
  4. Maik
    2022-03-11T03:16:19+08:002022-03-11T03:16:19+08:00

    Ctrl+Y将恢复删除的文本。

    • 4
  5. badc0de
    2022-03-12T14:10:08+08:002022-03-12T14:10:08+08:00

    逐步撤消:我有时会犯错误,只想修复最后一个更改或最后几个更改。最近我发现了ctrl+ x, ctrl+ u。如果您从头开始,则逐步执行“撤消”,直到您到达原始命令或空行。

    • 1
  6. Davidw
    2022-03-12T22:59:54+08:002022-03-12T22:59:54+08:00

    您始终可以使用命令查找以前使用的history命令,然后使用:

    !(number of the command in the history):s/(what you wish to correct)/(your correction)/

    例如,给定历史记录中的以下命令:

      995  brave_browser
    

    如果我想用连字符替换下划线,因为正确的命令是brave-browser,我会使用:

    !995:s/_/-/
    

    更多信息:https ://ss64.com/bash/history.html

    • 1

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve