自动清理 Bash 历史记录

自动清理 Bash 历史记录

如何自动清理 Bash 历史记录?例如

  • 从历史记录中删除可检测到的拼写错误(ls-lh未显示在 中which,因此将其删除,我的意思是输入ls -lh
  • 清理多余的空间cd  /cd /   应标准化,使它们相同。

这可以在 bash 中完成吗?也许在所有命令执行之前或进入历史记录之前对其进行过滤?

我希望我不必等到它被写入文件后再运行清理例程。这意味着在清理发生之前注销。:(

答案1

我更愿意对发生的所有常见错误保留别名

alias ls-lh = ls -lh

使用别名来修复缺少空格的拼写错误:

alias cd..='cd ..

使用 HISTIGNORE 指定要从历史记录中忽略的所有命令。用于export HISTIGNORE="$LIST"列出您想要忽略的历史记录

还有其他几个由内置“shopt”命令控制的选项。

这里

答案2

除了少数变量之外,我不知道有什么方法可以自定义历史记录HIST…。您可能想切换到 zsh,它更聪明一点(但只是一点点)。在 zsh 中,您可以打开命令自动更正(setopt correct),这将根据可用的命令名称建议对某些拼写错误进行更正(例如,在我的系统上,它提供更正为slls但不执行任何操作ls-lh)。 Zsh 的重复项更聪明,因为它可以检测非连续重复项(在setopt hist_ignore_all_dups)。 Zsh 在历史上没有进行任何空格规范化,但完成系统比 bash 更聪明,无论您输入全名还是点击,都能保持空格数量一致Tab,这很有帮助。

答案3

这个博客,这个脚本可以删除自动地bash 未找到的所有命令。

如果您还没有 bash PROMPT_COMMAND,请将其添加到.bashrc

PROMPT_COMMAND="mypromptcommand"
function mypromptcommand {
}

现在,每次提示即将出现时都会运行该函数。在其中,我们放置了以下内容:

local exit_status=$?
# If the exit status was 127, the command was not found. Let's remove it from history
local number=$(history | tail -n 1 | awk '{print $1}')
if [ -n "$number" ]; then
    if [ $exit_status -eq 127 ] && ([ -z $HISTLASTENTRY ] || [ $HISTLASTENTRY -lt $number ]); then
        history -d $number
    else
        HISTLASTENTRY=$number
    fi
fi

链接提供其工作原理的解释

相关内容