同时,由于你们提供了有关 中HISTIGNORE
选项的精彩提示,我成功地使我的历史记录变得更加清晰.bashrc
,省略了所有那些毫无意义的内容ll
或df -k
行。
然而,我也了解到这个HISTIGNORE
选择非常多限制性的, 也。例如,如果您有这样的行(简化)
HISTIGNORE='ll*:la*:cd*'
你不仅会把这些排除在外列表,但也出于你的“活生生的历史”因为我想命名您可以通过Cursor up/访问的易失历史记录Cursor down。尝试一下:无论您使用所述光标键在命令历史记录中循环多长时间,它们现在都将被完全忽略。
然而,有时我做需要这些行,特别是对于我不想重新输入的又长又复杂的路径。另一方面,我想要这些行独家的我的生活历史,而不是将它们存储在历史中列表因为它们会经常改变。
有什么办法可以做到这一点吗?
作为另一个旁注,我发现由于某种原因,“实时”历史和历史列表有时会不同很多(参见为什么使用相同的用户和历史命令会得到不同的结果)。
答案1
您可以使用HISTIGNORE
环境变量。
以冒号分隔的模式列表,用于决定哪些命令行应保存在历史列表中。例如:
export HISTIGNORE="cd*:ls*"
这将忽略历史记录中的所有 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}
}
答案2
3 种可能的选择
时间不够了 - 欢迎指正
0) 设置别名以允许您临时将每个命令保存到历史记录中
别名 histsave='$HISTIGNORE && HISTIGNORESAVED=$HISTIGNORE;希斯蒂尼诺=“”; echo "保存历史记录中的所有命令"' # 历史记录全部保存
alias histignore='$HISTIGNORESAVED && (HISTIGNORE=$HISTIGNORESAVED; echo "不保存:历史记录中的 $HISTIGNORES 命令"; exit(0)) || echo "I got nutn."' # 历史忽略一些
1) 在第二个 bash 会话中输入复杂的命令。
设置别名:alias histig='HISTIGNORE=""'
在一个终端中。右键单击并水平/垂直分割或以其他方式在同一位置启动新会话。
直方图
输入复杂命令 # 通常会保存在历史记录中
可选:
History -w # 使用history -r保存以供其他终端会话使用
2)存储复杂命令作为一次性的使用评论
在命令前面加上 # 前缀,使其成为注释:
点击:Home,#,输入。现在它已经进入你的历史了。
点击:向上键、home、删除(#)、输入...来运行命令。
优点:
允许您的历史记录通常排除您的 HISTIGNORE 设置。可以通过 grep History for '#' 来查找这些特别有用的命令。
解决方法:
如果您在历史记录中保存命令,则可以使用“##”。
缺点:
您将保存该命令,即使它第一次没有按要求/预期工作。
其中一些可能不适合你== YMMV