我正在写我的
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
,但我仍然从不同的终端会话中得到一些重复的内容。看来我仍然会得到一些重复项,但使用命令PROMPT_COMMAND="history -w;$PROMPT_COMMAND"
得到的更少。
我知道我可以做到
history -a;history -c; history -r
,但我不希望它们全部同步。我只希望当我调用history -n 时发生这种情况。我基本上只使用history -a 或history -w 但我似乎找不到两者之间的区别。哪一个最好必须避免尽可能多的重复。
history -a
将追加您的当前会话历史记录到历史文件的内容。
history -w
将用您的当前会话历史记录替换历史文件的内容。
哪一个可以避免更多重复?理论上都不是。 -a
和
-w
都不会检查重复项。有人可能会说
-w
避免了更多重复,但这只是因为它删除了历史文件的先前内容。因此,文件中任何潜在的重复条目都将被消除。以及文件中的其他任何内容。
对于最基本的用例,bash 历史记录功能的工作原理如下:在提示符中输入的所有命令都将被放入历史记录中。如果您在空提示符下按向上箭头,它将调用最后输入的命令。再次按向上键,它将调用倒数第二个命令。
如果您想要更高级的功能,例如避免重复,您首先需要了解以下内容:在任何 bash 会话中至少有两个版本的历史记录。一种是存储在当前运行的 bash 进程内存中的历史记录(会话历史记录)。另一种是保存在磁盘上的历史记录(历史文件)。每个正在运行的 bash 会话都有自己的会话历史记录。
在 bash 中工作时,您通常只使用会话历史记录。历史文件仅涉及某些事件。这些事件是:bash 启动、bash 关闭、调用
history -a
或
history -w
。在大多数发行版中,bash 配置如下:在 bash 启动时从历史文件读取会话历史记录。运行时仅操作会话历史记录。关闭时用当前会话历史记录替换历史文件的内容。
Bash 具有避免会话历史记录重复的功能。但据我所知,没有任何功能可以避免历史文件中的重复。
将特殊 bash 变量
HISTCONTROL
设置为
ignoredups
。现在,如果您执行同一命令两次(紧接着一个),第二个命令将不会保存到会话历史记录中。它不会删除以前不立即的条目。将特殊 bash 变量
HISTCONTROL
设置为
erasedups
。现在,如果您执行命令,它将删除会话历史记录中该命令的所有先前实例。但请注意,它仅在当前会话历史记录中执行此操作。它不会在历史文件中搜索重复项。使用
history -n
(从历史文件读取条目到会话历史记录)时,它也不会阻止重复项输入您的会话历史记录。
关于
命令。 关于
特殊变量HISTCONTROL
PROMPT_COMMAND
与
history
一起使用,并使用
sort
和
uniq
命令:
$> export PROMPT_COMMAND="history -a && history -c && sort ~/.bash_history | uniq > ~/.bash_history_new && rm ~/.bash_history && mv ~/.bash_history_new ~/.bash_history && history -r"
有了这个,您不需要设置
shopt -s histappend
并执行
export HISTCONTROL=erasedups
。这将保留您的历史记录和历史文件,而不会动态重复。您可以按照命令输入的顺序保留历史记录(提示:使用历史记录中的行号,从特定的行起始位置排序,并在删除重复项后再次使用行号排序)。