【问题标题】:Prevent accidental history editing in bash防止在 bash 中意外编辑历史记录
【发布时间】:2016-08-15 18:22:43
【问题描述】:

我最近从 tcsh 切换到了 bash,而一直困扰我的一件事是 bash 如何处理历史记录。我经常调出以前的历史命令并开始编辑它,但我意识到我需要先运行一个不同的命令。在 bash 中,这会编辑原始命令,我看不到我最初键入的内容。在 tcsh 中,当我使用向上和向下箭头时,已编辑的命令位于堆栈底部,并在我准备好时准备继续编辑或运行。

我找到了this question,其中有几个答案有助于理解 bash 在重新运行和编辑历史记录方面的工作原理,但我仍然不知道改变这种行为的方法(如果存在这种情况)。是否可以防止 bash 编辑已经运行的命令?

例如,如果我运行

  abcd
  efgh
  ijkl

然后使用向上箭头和退格 efgh 到 efg,然后按下并键入不同的命令“mnop”,我希望我的历史看起来像:

  abcd
  efgh
  ijkl
  mnop

目前看起来像:

  abcd
* efg
  ijkl
  mnop

这似乎是一个微不足道的问题,但是当运行具有多个需要反复试验的管道的长命令时,会造成一些重大的工作损失。

【问题讨论】:

  • 不要向下击,按Ctrl+c。
  • 谢谢 - 很高兴知道。有时我可能会忘记这一点,但在这和 chepner 的回答之间,我的状态应该会好得多。
  • 是的,这是一个非常严重的麻烦。历史在概念上和根据定义应该是不可变的。

标签: linux bash shell edit history


【解决方案1】:

每一行都有自己的撤消列表,您可以使用C-x C-uC-_ 访问以撤消最近的更改,或使用M-r 恢复自上次保存以来的所有更改。

【讨论】:

  • 这是完美的。感谢分享。我将如何寻找更多这样的快捷方式?当我搜索“bash history edit”或“bash history”时,这些都没有出现,而且如果没有这些键盘快捷键,似乎无法恢复历史记录。
  • 阅读 bind 内置命令并阅读手册页的 Readline 部分。许多函数都有默认绑定,但您可以使用bind 更改它们或为默认未绑定的命令添加绑定。
【解决方案2】:

是否可以防止 bash 编辑已经运行的命令?

可以阻止这个“功能”。我通过this answer over on unix.stackexchange找到了解决方案。

总而言之,您需要启用默认关闭的revert-all-at-newline readline 设置。如果设置为开启,那么当您执行下一个命令时,bash 将恢复您对历史记录所做的任何更改。

要在您的 shell 中启用此设置,您应该将以下内容添加到您的 ~/.inputrc 文件中,然后重新启动您的 shell:

$include /etc/inputrc
set revert-all-at-newline on

第一行是必需的,因为我猜如果您提供自己的 .inputrc 文件,则默认的 /etc/inputrc 文件不包括在内,这可能不是您想要的。

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 2011-01-28
    • 2010-09-25
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多