![禁用 Bash 历史记录中的重复项目](https://linux22.com/image/1404364/%E7%A6%81%E7%94%A8%20Bash%20%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E4%B8%AD%E7%9A%84%E9%87%8D%E5%A4%8D%E9%A1%B9%E7%9B%AE.png)
Fedora 19 中的 Bash 确实让我很烦。假设我运行一个命令:
echo "Hello"
然后我运行另一个命令:
echo "World"
echo "World"
现在我按下up
键盘上的 ,然后按回车键,再次运行最后一个命令( )N 次。(典型用法。)
问题是,尽管这些命令完全相同,但每个echo "World"
命令都会被插入到历史记录中。我只想按up
两次即可进入echo "Hello"
。但我必须按up
N+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 中。