history -a 与 -w。如何替换/追加和忽略/删除重复项?

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

我正在写我的

PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
,但我仍然从不同的终端会话中得到一些重复的内容。看来我仍然会得到一些重复项,但使用命令
PROMPT_COMMAND="history -w;$PROMPT_COMMAND"
得到的更少。

我知道我可以做到

history -a;history -c; history -r
,但我不希望它们全部同步。我只希望当我调用history -n 时发生这种情况。我基本上只使用history -a 或history -w 但我似乎找不到两者之间的区别。哪一个最好必须避免尽可能多的重复。

bash terminal gnome-terminal
3个回答
30
投票

history -a
追加您的当前会话历史记录历史文件的内容。

history -w
将用您的当前会话历史记录替换历史文件的内容。

哪一个可以避免更多重复?理论上都不是。

-a

-w
 都不会检查重复项。

有人可能会说

-w

 避免了更多重复,但这只是因为它删除了历史文件的先前内容。因此,文件中任何潜在的重复条目都将被消除。以及文件中的其他任何内容。


背景资料:

对于最基本的用例,bash 历史记录功能的工作原理如下:在提示符中输入的所有命令都将被放入历史记录中。如果您在空提示符下按向上箭头,它将调用最后输入的命令。再次按向上键,它将调用倒数第二个命令。

如果您想要更高级的功能,例如避免重复,您首先需要了解以下内容:在任何 bash 会话中至少有两个版本的历史记录。一种是存储在当前运行的 bash 进程内存中的历史记录(会话历史记录)。另一种是保存在磁盘上的历史记录(历史文件)。每个正在运行的 bash 会话都有自己的会话历史记录。

在 bash 中工作时,您通常只使用会话历史记录。历史文件仅涉及某些事件。这些事件是:bash 启动、bash 关闭、调用

history -a

history -w

在大多数发行版中,bash 配置如下:在 bash 启动时从历史文件读取会话历史记录。运行时仅操作会话历史记录。关闭时用当前会话历史记录替换历史文件的内容。

Bash 具有避免会话历史记录重复的功能。但据我所知,没有任何功能可以避免历史文件中的重复。


Bash 功能可避免会话历史记录(而不是历史文件)中出现重复:

将特殊 bash 变量

HISTCONTROL

 设置为 
ignoredups
。现在,如果您执行同一命令两次(紧接着一个),第二个命令将不会保存到会话历史记录中。它不会删除以前不立即的条目。

将特殊 bash 变量

HISTCONTROL

 设置为 
erasedups
。现在,如果您执行命令,它将删除会话历史记录中该命令的所有先前实例。但请注意,它仅在当前会话历史记录中执行此操作。它不会在历史文件中搜索重复项。使用 
history -n
(从历史文件读取条目到会话历史记录)时,它也不会阻止重复项输入您的会话历史记录。


bash 手册中有更多详细信息:

关于

history

 命令

关于

特殊变量HISTCONTROL


    


1
投票
您可以使用它来避免重复

export HISTCONTROL=ignoredups

您可以查看此以获取更多信息:

http://stefaanlippens.net/bashduplicates


0
投票
将 BASH 变量

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

这将保留您的历史记录和历史文件,而不会动态重复。您可以按照命令输入的顺序保留历史记录(提示:使用历史记录中的行号,从特定的行起始位置排序,并在删除重复项后再次使用行号排序)。

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