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