如何自动清理 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
),这将根据可用的命令名称建议对某些拼写错误进行更正(例如,在我的系统上,它提供更正为sl
,ls
但不执行任何操作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
链接提供其工作原理的解释