从~/.bash_history中删除历史记录

我有几个关于终端或命令行历史记录存储在~/.bash_history的问题。
  1. 我可以通过终端的history命令看到文件,但如果我尝试用gedit bash_history打开它,文件是完全空的。为什么?

  2. 我已经找到了如何从终端中删除文件中的特定行数的代码:

    for i in {1..N}; do history -d N; done
    

    其中N是您想要删除的行数(或命令数),但现在历史文件显示了这个最后的命令,如果您想要隐藏自己的操作,这并不明智。所以问题是: 如何执行最后的代码行,并确保它不被记录下来?


如何在bash历史记录中删除最后5行?与此相关的是这个问题 - dessert
以后注意,如果你在命令前加一个空格,那个命令将不会保存在你的历史记录中。 - Paddy Landau
7个回答

你只是忘了前面的点,打开(bash)终端历史文件的命令是:
gedit ~/.bash_history
这个文件只有在你关闭终端时才会更新。
要从该文件中删除最后10行,并且不记录这个命令本身,请打开一个新的终端并执行以下一系列命令:
sed -n -e :a -e '1,10!{P;N;D;};N;ba' ~/.bash_history && history -c && exit
或者
for i in {1..10}; do sed -i '$d' ~/.bash_history; done && history -c && exit
或者
head -n -10 ~/.bash_history > ~/.b_h_2 && mv ~/.b_h_2 ~/.bash_history && history -c && exit sedhead 分别从 ~/.bash_history 中删除选定的行,history -c 清除终端的历史记录,exit 关闭终端。

дёҖдёӘжҜ”for + sedжӣҙзҹӯдё”еёҢжңӣжӣҙеҝ«зҡ„жӣҝд»Јж–№жі•жҳҜдҪҝз”Ёhead -n -NпјҢе…¶дёӯеӨ§еҶҷзҡ„NиЎЁзӨәиҰҒеҲ йҷӨзҡ„иЎҢж•°гҖӮhttps://stackoverflow.com/a/13380679/711006 - Melebius
2@Melebius 看起来很有希望,但是你如何将输出重定向到输入文件并覆盖它呢?head -n -N testfile > testfile只会清空文件!我添加了一个解决方法,但肯定不是更简短的。 - dessert
你是对的,我忘了head不能像sed那样原地操作。我主要是在寻找一个单一的sed命令来替换你的for循环。我在链接的页面上看到了一些选项,但它们看起来不如你的代码易懂。 - Melebius
@Melebius 请参考sed1line.txt获取相关信息 - 我已将其添加在上方,虽然长度并没有变短,但应该会更快速。 - dessert

bash_history文件是一个以点开头的隐藏文件。你需要这样做
gedit ~/.bash_history

这将在gedit中打开文件。

如果你只想删除命令日志中的特定部分,那么上述方法就可以了。如果你想要停止某个特定的bash会话的命令记录,那么执行以下命令即可。
unset HISTFILE

要更彻底一些,如果你不希望任何命令被记录,那么你可以这样做
rm ~/.bash_history
ln -s /dev/null ~/.bash_history

请注意,第一种方法只在单个会话中生效,而第二种方法将停止所有未来会话的命令记录。

我知道这个问题已经有了一个被接受的答案,但这是我从80年代开始使用的方法。这是一个很好的隐藏踪迹的方式,它是一个多阶段的方法。大部分情况下,除非真的注意到,否则不会被注意到。以下是具体操作步骤:
打开一个终端/Shell/会话,然后执行以下操作:
 chmod 444 ~/.bash_history

退出shell 打开一个终端/Shell/会话并执行: 以下是一些创意的方法来永久清除历史记录。
 vi ~/.bash_history
 9999999 dd
 <esc>wq!

2(创建一个虚假的历史)

 sudo echo "which ls" > ~/.bash_history
 sudo echo "cd ~/;ls" >> ~/.bash_history

然后再加一点儿:
 chmod 444 ~/.bash_history

退出shell
打开一个新的shell并输入
 history

如果使用ls -ratl命令,~/.bash_history文件将在目录列表的喧嚣中逐渐消失,这样就不会以链接的形式出现,从而避免引起不必要的注意。大多数人在root目录下不会使用-a选项,而这个选项在需要模拟时非常有用。
然而,这种方法的缺点是你失去了回溯和检索历史记录的能力。实际的~/.bash_history文件可能会因为长时间没有修改而出现在目录列表的顶部,这本身可能会导致发现某些异常情况。

如果你使用9999999 dd来删除文件中的所有行,那么:%d:1,$ddG效果更好。 - phuclv

历史记录只有在您退出shell后才会保存。尝试退出shell,然后再查看.bash_history文件。命令历史记录应该在其中。

现在还可以吗? - The Lightning Stalker

1)运行sh;这将生成一个ash的子shell,它根本不记录历史。从那里进行编辑。
2)在.bashrc中添加一行HISTCONTROL=ignoreboth,然后使用exec bash永久替换当前的shell为重新初始化的shell,然后对所有不想记录的命令加上一个前导空格。

由于我还不能评论,所以将我的评论作为答案添加:
使用man history就能解决所有问题。
对于问题1的回答是历史记录保存在内存中。使用history -a立即保存到文件中。使用history -w也可以保存,但可能会影响其他会话。
问题2的答案是:使用history -a,然后使用gedit删除你想要的行,最后使用history -r重新加载。