我的 ~/.bashrc 中有以下行
export HISTCONTROL=ignoreboth:erasedups
但是,每当我运行时,它都会像这样somecommand
添加重复的命令.bash_history
grep -w somecommand ~/.bash_history
somecommand
somecommand abc xyz
somecommand 123
somecommand
...
这是为什么以及如何预防呢?
答案1
该erasedups
选项将删除受这两个条件限制的重复行:
- 这些行将从列表中删除记忆。
- 仅当新命令要添加到列表中时。
内存中的列表是 的输出history
。当 bash 关闭时,
“内存中”的整个列表将被写入文件(如果未设置 histappend)。history -w
所以,如果内存中的列表是:
$ history
1 cmd1
2 cmd2
3 cmd3
4 cmd1
5 cmd2
6 export HISTCONTROL=ignoreboth:erasedups
7 history
它将变成:
$ history
1 cmd2
2 cmd3
3 cmd2
4 export HISTCONTROL=ignoreboth:erasedups
5 cmd1
6 history
所有 cmd1 命令(附加的命令除外)都将被删除。
如果cmd2
执行,所有重复的cmd2
也将被删除(也history
):
$ cmd2
$ history
1 cmd3
2 export HISTCONTROL=ignoreboth:erasedups
3 cmd1
4 cmd2
5 history
但即使现在,该文件~/.bash_history
也没有被修改。它仍然包含上一个会话中的命令列表。对文件使用 grep 可能会显示许多重复项 (dups),包括刚刚使用的命令(cmd1 和 cmd2)。 grep 只能在内存列表上正确工作:
$ history | grep cmd1
一旦列表写入文件(history -w),使用 grep 是否只能找到会话中使用的每个命令行的一个实例。
您可以使用以下命令强制每次更新磁盘文件:
$ PROMPT_COMMAND='history -w'
答案2
根据man bash
:
ignoredups 值会导致不保存与先前历史记录条目匹配的行。
如果您somecommand
在没有参数的情况下连续运行两次,您应该只看到一个连续的入口。
同样,如果您somecommand 123
连续运行两次,则只会将其添加到历史记录中一次。
列表中的命令显示没有连续的重复,因此此功能按预期工作。
答案3
唯一地记录每个新命令是很棘手的。首先您需要添加
~/.profile
或类似:
HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'
然后你需要添加~/.bash_logout
:
history -a
history -w