如何从历史列表中排除命令,但将其保留在“实时”历史中?

syn*_*ror 5 bash command-history

同时,由于你们提供了关于HISTIGNORE选项的重要提示,我已经设法使我的历史记录更加清晰.bashrc,省略了所有那些毫无意义的lldf -k台词。

但是,我也了解到该HISTIGNORE选项也非常严格。例如,如果你有这样一行(简化)

HISTIGNORE='ll*:la*:cd*'
Run Code Online (Sandbox Code Playgroud)

您不仅会将这些排除在列表之外,还会排除在您的“实时历史记录”之外,因为我想为您可以通过Cursor up/访问的易变历史进行配音Cursor down。试试看:无论您使用上述光标键在命令历史记录中循环多久,它们现在都将被完全省略。

但是,有时我确实需要这些行,尤其是对于我不想重新键入的非常长且复杂的路径。另一方面,我希望将这些行属于我的实时历史记录,而不是将它们存储在历史记录列表中,因为它们会经常更改。

有什么办法可以做到这一点吗?

另一方面,我发现出于某种原因,“实时”历史记录和历史记录列表有时会有很大差异(参见为什么我使用相同的用户和历史命令得到不同的结果)。

Dan*_*k82 2

您可以使用HISTIGNORE环境变量。

以冒号分隔的模式列表,用于决定哪些命令行应保存在历史列表中。例如:

export HISTIGNORE="cd*:ls*"
Run Code Online (Sandbox Code Playgroud)

这将忽略历史记录中的所有 cd 和 ls 命令。

编辑:

抱歉,在我第一次阅读时,我没有充分考虑你的问题。顺便说一句,你是对的:HISTIGNORE这是一个非常困难的设置,并且 bash_history 将简单地忽略此变量中列出的每个命令(它将在你执行它时忽略它,如果这些命令已经存在到你的条目中,它们HISTFILE将是通过历史反向搜索找到。

首先回答你的最后一个问题,如果您同时使用不同的终端,实时历史和书面历史可能会有很大差异。您可以尝试如下所述的解决方案:

在多个终端窗口中保留 bash 历史记录

您可以想象一个解决方案,其中您使用文件中的函数~/.bash_logout,这将删除您不想要的历史记录条目。

像这样的事情应该做你想做的:

 function clear_history(){
    # hist_ignore regex, this may be done in a more fancy way, 
    # such as using an env variable, but anyway
    MYHISTIGNORE='^cd:^view:^cat'

    # write down history to file
    history -w

    # create a new tmp file for history
    tmpFile=$(mktemp)
    cp ${HISTFILE}  ${tmpFile}

    # use it to filter history
    for myRegex in $(echo $MYHISTIGNORE | awk 'BEGIN{FS=":"}{for (i=1;i<=NF;i++){print $i}}'); do 
       sed -i "/${myRegex}/d" ${tmpFile}
    done

    # and copy it back to history file
    mv ${tmpFile} ${HISTFILE}
}
Run Code Online (Sandbox Code Playgroud)