禁用 Bash 历史记录中的重复项目

禁用 Bash 历史记录中的重复项目

Fedora 19 中的 Bash 确实让我很烦。假设我运行一个命令:

echo "Hello"

然后我运行另一个命令:

echo "World"

echo "World"现在我按下up键盘上的 ,然后按回车键,再次运行最后一个命令( )N 次。(典型用法。)

问题是,尽管这些命令完全相同,但每个echo "World"命令都会被插入到历史记录中。我只想按up两次即可进入echo "Hello"。但我必须按upN+1 次。

为什么这个功能坏了?我该如何修复它?

答案1

唯一地记录每个新命令是比较困难的。首先你需要添加 ~/.profile或类似内容:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

然后您需要添加~/.bash_logout

history -a
history -w

答案2

我不知道如何解决这个问题,但我将给你一个更好的选择。使用“Ctrl+r echo”执行此操作,并使用“Ctrl+r”遍历你输入的版本。这样速度更快,当你掌握技巧后,你会爱上它。

例子

Ctrl+r 回显

提示显示:“echo World”,如果这不是你想要的,再按一次 Ctrl+r

提示符显示:“echo hello”,如果这不是您想要的,请按 Ctrl+r。如果这是您想要的,只需按 Enter 即可。

而且,您不需要按顺序开始您的单词,您可以这样做:

Ctrl+r 世界

提示符将显示“echo World”,您可以按 Enter 来执行它。

太简单。

答案3

正如@suspectus 指出的那样,这是“错误的”,因为每个命令默认都会输入到历史记录中。

但是,您可以通过设置 Bash 变量来指示 Bash 删除重复项HISTCONTROL。(文档:http://www.gnu.org/software/bash/manual/bashref.html#Bash-Variables)。它是用冒号分隔的零个或多个关键字列表,您最感兴趣的可能是erasedups。请注意,只有历史进入当前会话受到影响。设置HISTCONTROL=erasedups不会返回并删除您以前会话中的重复项(但请查看下面的另一种解决方案)。另请注意,这HISTCONTROL是一个 Bash 变量,不需要导出。

无论如何,我的设置是:

HISTCONTROL=ignoreboth:erasedups
HISTIGNORE="?:??:???:$HISTIGNORE"
HISTSIZE=5000

我开始使用这些设置是因为我对许多琐碎且重复的命令感到厌烦,这些命令将精心制作的命令“排除在列表之外”。该HISTIGNORE设置会忽略短命令。我发现键入“向上箭头”来检索命令(如)并不短ls,所以我宁愿根本不存储一到三个字母的命令。此外,以空格开头的任何内容都不会存储在历史记录中。我将其用于一次性命令。

请注意,如果您同时打开多个会话,则重复项仍可能会累积。有时,我会使用以下一行代码从历史文件中删除重复项:

tac ~/.bash_history | awk '!seen[$0]++' | tac > .tmp.newhist && mv .tmp.newhist ~/.bash_history

答案4

Bash 历史记录无法区分重复的命令。所有命令都记录在历史记录中。快速获取所需命令的一种方法是:

set -o vi

键入ESC,然后/hello 会为您提供带有字符串“hello”的最新命令。使用向上箭头列出与字符串“hello”匹配的先前命令。其他 vi 命令可用于检索/导航命令。

如果有用,set -o vi可以将其添加到HOME目录中的 .bashrc 中。

相关内容