syn*_*ror 5 bash command-history
同时,由于你们提供了关于HISTIGNORE选项的重要提示,我已经设法使我的历史记录更加清晰.bashrc,省略了所有那些毫无意义的ll或df -k台词。
但是,我也了解到该HISTIGNORE选项也非常严格。例如,如果你有这样一行(简化)
HISTIGNORE='ll*:la*:cd*'
Run Code Online (Sandbox Code Playgroud)
您不仅会将这些排除在列表之外,还会排除在您的“实时历史记录”之外,因为我想为您可以通过Cursor up/访问的易变历史进行配音Cursor down。试试看:无论您使用上述光标键在命令历史记录中循环多久,它们现在都将被完全省略。
但是,有时我确实需要这些行,尤其是对于我不想重新键入的非常长且复杂的路径。另一方面,我希望将这些行专属于我的实时历史记录,而不是将它们存储在历史记录列表中,因为它们会经常更改。
有什么办法可以做到这一点吗?
另一方面,我发现出于某种原因,“实时”历史记录和历史记录列表有时会有很大差异(参见为什么我使用相同的用户和历史命令得到不同的结果)。
您可以使用HISTIGNORE环境变量。
以冒号分隔的模式列表,用于决定哪些命令行应保存在历史列表中。例如:
export HISTIGNORE="cd*:ls*"
Run Code Online (Sandbox Code Playgroud)
这将忽略历史记录中的所有 cd 和 ls 命令。
编辑:
抱歉,在我第一次阅读时,我没有充分考虑你的问题。顺便说一句,你是对的:HISTIGNORE这是一个非常困难的设置,并且 bash_history 将简单地忽略此变量中列出的每个命令(它将在你执行它时忽略它,如果这些命令已经存在到你的条目中,它们HISTFILE将是通过历史反向搜索找到。
首先回答你的最后一个问题,如果您同时使用不同的终端,实时历史和书面历史可能会有很大差异。您可以尝试如下所述的解决方案:
您可以想象一个解决方案,其中您使用文件中的函数~/.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)
| 归档时间: |
|
| 查看次数: |
2745 次 |
| 最近记录: |