如何避免.bash_history中的重复条目


108

我的历史记录中一次又一次列出了相同的命令。如何避免这种情况?我知道可以通过HISTCONTROL但我没有找到正确的方法。


我创建了一个相关的问题:askubuntu.com/questions/205520/…。历史记录中的复制有助于查看命令的上下文。在打印历史记录时,有时您想忽略的内容会被忽略。
justingordon 2012年

Answers:


123

bash手册页:

历史控制

用冒号分隔的值列表,用于控制如何在历史记录列表中保存命令。如果值列表包含ignorespace,则以空格字符开头的行不会保存在历史记录列表中。值的值 ignoredups导致不保存与先前的历史记录条目匹配的行。的值ignorebothignorespace 和的 简写 ignoredups。值erasedups使与当前行匹配的所有先前行在保存该行之前从历史记录列表中删除。不在上面列表中的任何值都将被忽略。如果未设置HISTCONTROL或不包含有效值,则由外壳解析器读取的所有行都将存储在历史记录列表中,但要遵循HISTIGNORE的值。多行复合命令的第二行和后续行未经测试,并且无论HISTCONTROL的值如何都添加到历史记录中。

因此,将以下行放入您的~/.bashrc

export HISTCONTROL=ignoreboth:erasedups


您是否要我在〜/ .bashrc的底部添加HISTCONTROL = ignoreboth?
karthick87

1
@karthick放在哪里都无所谓,但底部可以。
以赛亚书

在我的Ubuntu安装12.04的我不得不做出这个改变~/.bash_login大部分时间,如果.bashrc中被修改,它会工作,但认为并非如此所有的时间。
ck- 2012年

3
更新bash个人资料/ rc文件后,请不要忘记运行这些文件source ~/.bashrc && source ~/.bash_profile
Eric Kigathi

23

将此贴在您的~/.bashrc

export HISTCONTROL=ignoredups

您可以改用ignoreboth。这是ignorespaces(以空格开头的命令)和ignoredups(重复的)命令的简写。

我更喜欢ignoredups单独使用,因为当我从网站上复制命令时,我发现默认行为是忽略了在前面带有空格的命令,这很烦人,并且由于我也无意间在空格中复制了命令而无法保存该命令。每个人自己的。


3
仍然存在重复..可能是什么问题??imgur.com/fXeLQ.png
karthick87

5
@ karthick87引用了另一个答案:值的值ignoredups导致不保存与先前的历史记录条目匹配的行。它仅删除连续的相同行。
AL

10

将其放入~/.bashrc@alvin的解决方案将在不同的会话中应用为wlell

HISTCONTROL=ignoredups:erasedups
shopt -s histappend
PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"

来源:Linux:Bash历史记录:“ ignoredups”和“ erasedups”设置与跨会话的通用历史记录冲突


为什么他使用export HISTCONTROL而您的却不使用?有什么不同?它对我
有用

1
好问题!我也想知道答案。通常,export使变量可用于子流程。stackoverflow.com/q/1158091/552621在的情况下HISTCONTROLPROMPT_COMMAND等等,这些变量使用的外壳本身,所以也许它们导出(孩子处理)是没有必要的。
Nour Wolf


3

将以下内容添加到您的~/.bashrc

export HISTCONTROL=ignoredups

为此,您可以使用以下命令:

nano ~/.bashrc

0

唯一地记录每个新命令是很棘手的。首先,您需要添加 ~/.profile或类似内容:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

然后,您需要添加到~/.bash_logout

history -a
history -w
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.