用bash编辑历史记录

时间:2010-03-16 23:02:55

标签: linux bash shell command-line

在bash中,当我回到历史记录中,编辑一些命令并运行它时,这个编辑过的命令被附加到历史记录中,原始命令保持不变。但每隔一段时间我就会设法影响原始命令,即我的编辑会在历史记录中替换原始命令。我无法理解这是怎么发生的。谁能解释一下?我的目标是避免这种情况,因此对上一个命令的任何编辑总是会附加到历史记录中,并且永远不会替换原始命令。

4 个答案:

答案 0 :(得分:5)

如果你回到之前的一些命令并进行编辑,但是不要执行它(而是使用历史命令转到其他命令并执行它),那么编辑将保留在历史列表中。< / p>

在编辑后按 Ctrl + C 可以对抗此行为。它保留原始命令,即取消记住对原始命令的编辑。

答案 1 :(得分:2)

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

当在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样式编辑ALONE不会影响历史记录中的原始命令。

答案 2 :(得分:2)

  

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

对。如果您返回历史记录并编辑而没有行,请按回车键以执行命令,但转而移至另一个历史记录条目,则只需编辑历史记录条目。如果然后列出您的历史记录,您将在一行上看到*,表明您已对其进行了编辑。我发现这个“功能”非常令人沮丧。其他人则提供了如何重现此事的好例子。

  

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

我也想禁用它。我通过this answer over on unix.stackexchange找到了解决方案。

总结一下,您需要启用revert-all-at-newline阅读行设置,该设置默认为关闭。如果该设置处于启用状态,则bash将在您执行下一个命令时还原对历史记录所做的任何更改。

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

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

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

答案 3 :(得分:1)

做什么

echo $HISTCONTROL
echo $HISTIGNORE

给你?

修改

我能够通过以下步骤重现类似于您所看到的行为:

  • 在shell提示符下,输入:

    echo abcd
    echo efgh

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

  • 按1在末尾添加该字符

  • 按“退出”进入命令模式

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

  • 按x删除“c”

  • 按enter

现在,当您退回历史记录时,您会在最后看到一个新条目:

echo abd1

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

echo abcd1

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