如何从 Bash 历史文件中删除重复的命令?

问题描述 投票:0回答:1

我已经配置了自己的

.bash_myhistory

export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "

export HISTFILE=~/.bash_myhistory
PROMPT_COMMAND="history -a; history -r; $PROMPT_COMMAND"

当我运行

history
时,它会向我显示许多重复的输出:

 $ history | grep 'git rebase'
   75  [2018-05-23 16:39:39] git rebase -p dev_hypermouse 
  168  [2018-05-23 19:27:39] man git rebase 
  547  [2018-05-25 19:01:44] git rebase master 
  639  [2018-05-25 20:24:52] git rebase master 
  869  [2018-05-28 14:07:33] git rebase xxx
  921  [2018-05-28 16:12:20] git rebase dash_v2 
  922  [2018-05-28 16:12:33] man git rebase
  925  [2018-05-28 16:13:21] man git rebase
  927  [2018-05-28 16:15:42] git rebase xxx dash_v2 
  937  [2018-05-28 16:17:46] git rebase --onto dash_v2 xxx 296-ToS-component 
 2177  [2018-05-23 16:39:39] git rebase -p dev_hypermouse 
 2270  [2018-05-23 19:27:39] man git rebase 
 2649  [2018-05-25 19:01:44] git rebase master 
 2741  [2018-05-25 20:24:52] git rebase master 
 2971  [2018-05-28 14:07:33] git rebase xxx
 3023  [2018-05-28 16:12:20] git rebase dash_v2 
 3024  [2018-05-28 16:12:33] man git rebase
 3027  [2018-05-28 16:13:21] man git rebase
 3029  [2018-05-28 16:15:42] git rebase xxx dash_v2 
 3039  [2018-05-28 16:17:46] git rebase --onto dash_v2 xxx 296-ToS-component 
 4239  [2018-05-23 19:27:39] man git rebase 
 4618  [2018-05-25 19:01:44] git rebase master 
 4710  [2018-05-25 20:24:52] git rebase master 
 4940  [2018-05-28 14:07:33] git rebase xxx
 4992  [2018-05-28 16:12:20] git rebase dash_v2 
 4993  [2018-05-28 16:12:33] man git rebase
 4996  [2018-05-28 16:13:21] man git rebase
 4998  [2018-05-28 16:15:42] git rebase xxx dash_v2 
 5008  [2018-05-28 16:17:46] git rebase --onto dash_v2 xxx 296-ToS-component 
 ...

但是

$ cat ~/.bash_myhistory | grep 'git rebase'
没有:

man git rebase 
git rebase master 
git rebase master 
git rebase xxx
git rebase dash_v2 
man git rebase
man git rebase
git rebase xxx dash_v2 
git rebase --onto dash_v2 xxx 296-ToS-component 
man git rebase
man git rebase
history | grep git rebase
history | grep 'git rebase'

如何修复

history
的重复输出?

UPD

使用

export HISTCONTROL=ignoreboth:erasedups
历史看起来好多了,但重复仍然存在:

$ history | grep 'git rebase'
   34  [2018-05-23 19:27:39] man git rebase 
  413  [2018-05-25 19:01:44] git rebase master 
  505  [2018-05-25 20:24:52] git rebase master 
  735  [2018-05-28 14:07:33] git rebase xxx
  787  [2018-05-28 16:12:20] git rebase dash_v2 
  788  [2018-05-28 16:12:33] man git rebase
  791  [2018-05-28 16:13:21] man git rebase
  793  [2018-05-28 16:15:42] git rebase xxx dash_v2 
  803  [2018-05-28 16:17:46] git rebase --onto dash_v2 xxx 296-ToS-component 
 2038  [2018-06-02 14:49:31] man git rebase
 2058  [2018-06-02 14:52:33] man git rebase
 2060  [2018-06-02 15:11:08] history | grep git rebase
 2061  [2018-06-02 15:11:13] history | grep 'git rebase'
 2063  [2018-06-02 15:12:45] cat .bash_myhistory | grep 'git rebase'
 2064  [2018-06-02 15:09:58] man git rebase
 2077  [2018-06-02 15:35:41] history | grep 'git rebase'
 2111  [2018-05-23 19:27:39] man git rebase 
 2490  [2018-05-25 19:01:44] git rebase master 
 2582  [2018-05-25 20:24:52] git rebase master 
 2812  [2018-05-28 14:07:33] git rebase xxx
 2864  [2018-05-28 16:12:20] git rebase dash_v2 
 2865  [2018-05-28 16:12:33] man git rebase
 2868  [2018-05-28 16:13:21] man git rebase
 2870  [2018-05-28 16:15:42] git rebase xxx dash_v2 
 2880  [2018-05-28 16:17:46] git rebase --onto dash_v2 xxx 296-ToS-component 
 4115  [2018-06-02 14:49:31] man git rebase
 4135  [2018-06-02 14:52:33] man git rebase
 4137  [2018-06-02 15:11:08] history | grep git rebase
 4138  [2018-06-02 15:11:13] history | grep 'git rebase'
 4140  [2018-06-02 15:12:45] cat .bash_myhistory | grep 'git rebase'
 4141  [2018-06-02 15:09:58] man git rebase
 4154  [2018-06-02 15:35:41] history | grep 'git rebase'

UPD
即使添加了

export HISTCONTROL=ignoreboth:erasedups
历史记录也看起来像:

25988  [2018-07-26 17:13:19] gd 1
25989  [2018-07-26 15:45:47] mc
25990  [2018-07-26 13:57:46] mc
25991  [2018-07-26 09:23:28] mc

我还注意到一些命令从历史记录中消失了=(

bash configuration history
1个回答
8
投票
export HISTCONTROL=ignoreboth:erasedups

来自 bash 手册页:

历史控制

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

© www.soinside.com 2019 - 2024. All rights reserved.