【问题标题】:How to disable editing my history in bash如何禁用在 bash 中编辑我的历史记录
【发布时间】:2011-01-28 08:44:12
【问题描述】:

在 bash 中,当我返回历史记录时,编辑一些命令并运行它,这个编辑过的命令会附加到历史记录中,而原始命令则保持不变。但是每隔一段时间,我就会设法影响原始命令,即我的编辑会替换历史中的原始命令。我无法确定这是如何发生的。

谁能解释一下?我的目标是避免这种情况,因此对先前命令的任何编辑总是会附加到历史记录中,并且永远不会替换原始命令。

【问题讨论】:

标签: linux bash shell command-line


【解决方案1】:

如果您返回某个先前的命令并对其进行编辑,但随后不执行它(而是使用历史命令转到其他命令并执行它),则编辑将保留在您的历史列表中。

在编辑后按 Ctrl + C 会抵消这种行为。它保留原始命令,即取消记住对原始命令的编辑。

【讨论】:

  • 但是,如果您返回相同的命令并执行它(无论是否进一步编辑),历史都会恢复。另一方面,如果您退出 bash,那么这些编辑将被永久记录。
【解决方案2】:

我以某种方式设法影响了原始命令,即我的编辑替换了历史记录中的原始命令。

没错。如果您返回历史记录并编辑行而不按回车键来执行命令,而是移动到另一个历史记录条目,那么您只是编辑历史记录条目。如果您随后列出您的历史记录,您将在行上看到一个*,表明您对其进行了编辑。我发现这个“功能”非常令人沮丧。其他人提供了如何重现这一点的好例子。

我的目标是避免这种情况,因此对先前命令的任何编辑总是会附加到历史记录中并且永远不会替换原始命令。

我也想禁用它。我通过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 文件,这可能不是您想要的。

【讨论】:

  • 这应该是公认的答案。它可以防止虚假编辑,这似乎是应该是默认的良好行为。
【解决方案3】:

这是我自己的答案,如果可以,请更正或提供更多详细信息。

在bash中设置“vi”选项时(“set -o vi”--“使用vi风格的命令行编辑界面”),从历史中编辑命令有两种模式。

第一种模式(我们称之为“基本”)是当您使用 Backspace、Del 和字符键立即开始编辑时。

另一种模式是“vi 模式”,按 Esc 键进入。

如果您想保持历史记录完整,请勿在同一编辑中使用两种模式。我不知道 bash 究竟是如何工作的,但你可以这样想:

  1. 进入“vi 模式”会将在“基本模式”中所做的任何更改应用于原始命令,并创建命令副本,您可以使用 vi 样式命令进一步编辑。
  2. 当您按 Enter(执行)、Up、Down 或 j,k(移动到历史记录中的另一个命令)时,更改会生效。
  3. 如果您按 Ctrl-C,则不会应用更改。
  4. 单独使用基本或 vi 样式编辑不会影响历史中的原始命令。

【讨论】:

    【解决方案4】:

    做什么

    echo $HISTCONTROL
    echo $HISTIGNORE
    

    给你?

    编辑:

    按照以下步骤,我能够重现与您看到的类似的行为:

    • 在 shell 提示符下,输入:

      echo abcd
      echo efgh

    • 按两次向上箭头,显示“echo abcd”

    • 按 1 在末尾添加该字符

    • 按退出键进入命令模式

    • 按两次左箭头,使光标位于“c”上

    • 按x删除“c”

    • 按回车

    现在,当您回顾历史时,您会在末尾看到一个新条目:

    echo abd1
    

    之前有“echo abcd”的条目现在看起来像这样:

    echo abcd1
    

    这是一种方式,我相信还有其他方式。

    【讨论】:

    • 空白。我没有那些定义。我认为这与设置无关。这是不一致的。如果你让我重复一遍,我将无法做到。我想我是通过不小心碰到一些 vi 组合来做到这一点的。我的编辑器由“set -o vi”设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多