我正在Mac OSX上工作,所以我想我正在使用bash ...?

有时我输入的内容我不想在历史中被记住。如何删除它?

评论

非常相似:有什么方法可以防止将命令添加到您的历史记录中吗?

#1 楼

预防措施

如果您想在不保存历史记录的情况下运行命令,请在命令前加上多余的空间

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space


此命令可以正常工作您需要在ignorespace中使用ignorebothHISTCONTROL。例如,运行

HISTCONTROL=ignorespace


要使此设置持久化,请将其放入您的.bashrc中。

事后清理

如果您已经运行过该命令,并且想要将其从历史记录中删除,请首先使用

history


显示历史记录中的命令列表。找到您要删除的行旁边的数字(例如1234),然后运行

history -d 1234


另外,如果您要删除的行已被写入$ HISTFILE(通常默认情况下会在结束会话时发生),您将需要写回$ HISTFILE,否则在打开新会话时该行会重新出现:

history -w


评论


有效。我认为我们需要在修改〜/ .bashrc之后将其来源...

– B七
2012年9月26日在18:00

@BSeven是的,当shell运行时,所有bash设置都存储在RAM中。 rc文件仅用于在下次Shell启动时存储持久性设置。

– jw013
2012年9月26日18:03



@ jw013我将PROMPT_COMMAND设置为history -a,在这种情况下,它已被写入历史文件,而不是在正常配置下退出时。具体来说:mywiki.wooledge.org/BashFAQ/088

–jordanm
2012-10-22 3:54



如何在zshrc shell中执行相同的操作

– Kasun Siyambalapitiya
18年2月3日在13:01

它对我不起作用。

–Felipe
20年6月20日在5:17

#2 楼



要清除所有历史记录,请使用

history -c



要删除一行,请使用

history -d linenumber




评论


它对我不起作用。

–Felipe
20年6月20日在5:17

这肯定可以使用“行号”是什么以及如何找到它的解释。

– Clonkex
20-09-18的1:59

#3 楼

我在~/.bashrc中有此命令,这使命令$ forget从历史记录中删除了先前的命令

function forget() {                                                              
   history -d $(expr $(history | tail -n 1 | grep -oP '^ \d+') - 1);              
}


评论


这似乎有点复杂。历史-d $(历史|尾-n 1 |切-f 1 -d“”)会更简单吗?

–seumasmac
2015年10月3日在1:40



历史| tail -n1是历史命令本身,因此删除该数字将得到错误的输入。但是,history -d $(history | awk'END {print $ 1-1}')组合了行选择,字段选择和减法。

–dave_thompson_085
2015年10月3日,3:03

有人可以帮忙将其移植到zshell吗?

– Alex S
2015年10月14日下午13:27

#4 楼

如果您想忘记整个bash会话,则可以kill当前的bash进程。由于变量$$保留当前外壳程序的pid,因此您可以执行以下操作:

kill -9 $$


评论


这不会考虑写入$ HISTFILE的历史记录。

– Kusalananda♦
20年4月2日在8:02

@Kusalananda,除非您已采取特殊措施立即写入$ HISTFILE,否则此方法将起作用。我认为唯一考虑的是$ HISTFILE。 (根据我的建议)您有什么经历引起您的关注?

–布鲁诺·布鲁诺斯基(Bruno Bronosky)
20年4月13日在15:39

如果用户输入的内容是在先前的会话中,则杀死当前外壳程序不会从历史记录文件中删除该单一内容。另外,我在系统上管理员已更改了默认设置,以便在每个给定命令之后将命令写入历史文件。我们对当前用户的设置一无所知。

– Kusalananda♦
20-4-13在15:41



@Kusalananda您的陈述是正确的。但是,我希望没有人会试图杀死当前的过程,以影响过去完成的过程的结果。这是不合逻辑的期望。但这确实暗示了与您的原始评论略有不同的措词,可以避免造成混淆。 “这不会影响在以前的会话中写入$ HISTFILE的历史记录。”换句话说,“这个概念只对防止这种情况有用,而不能纠正它。”谢谢你的澄清,朋友。

–布鲁诺·布鲁诺斯基(Bruno Bronosky)
20年4月13日在15:48

好吧,它也不会影响当前会话中写入$ HISTFILE的历史记录,因此我真的不知道该注释如何被误解。您唯一需要添加到答案中的就是假设,给定的解决方案可以用来解决问题。实际上,只有一个假设,即尚未从历史记录中删除的命令尚未写入$ HISTFILE。然后,您可能需要详细说明在什么条件下将命令写入$ HISTFILE。

– Kusalananda♦
20年4月13日在15:53

#5 楼

您始终可以编辑和删除~/.bash_history中的条目,当您想要删除一个或多个条目时非常有用

评论


退出外壳程序时,很可能会重新引入这些条目。

–l0b0
18年7月17日在2:56

这可能会不必要地删除多余的内容,或者可能不会删除任何内容,具体取决于外壳的配置方式。

– Kusalananda♦
20-4-2在8:03

#6 楼

要从历史记录文件中删除一行,请使用-d选项。例如,如果您要像上述情况一样清除输入明文密码的命令,请在历史记录文件中找到行号,然后运行此命令。

$ history -d 2038

要删除或清除bash历史记录中的所有条目,请在下面的带有-c选项的history命令中使用。

$ history -c

也可以使用以下命令下面的命令将永久删除文件中最后执行的所有命令的历史记录。

$ cat /dev/null > ~/.bash_history

还可以使用Bash 5删除范围

history -d 511-520

评论


历史-d行号对我不起作用。我正在使用Mac。

–好奇
20 Jan 27 '20在10:13

您需要酿造酒桶安装Jumpcut,否则请按照以下步骤操作

–冠军亚军
20 Jan 27 '20在10:51

#7 楼

1-在bash终端类型中

history#这将列出历史记录.bash_history文件中的所有命令,其行号

例如:

  ...
  987  cd
  988  ssh x@127.0.0.1
  990  exit
  991  cd


2-选择要删除的CMD行号

history -d 988

注意:如果要删除例如最后3个CMD,只需选择从底部开始的第三行编号:988,并依次重复CMD history -d 988 3次。

评论


欢迎使用U&L!这看起来确实类似于接受的答案(的一部分)(关于删除连续命令的建议除外)。您可以添加任何内容来减少重复吗?

–fra-san
20 Mar 16 '20在10:41

抱歉,没有,乍一看,我不明白被接受的答案(并且您不会相信我已经检查了其他答案并提供了更多详细信息),所以当我发现历史命令列出了我只想解释的使用命令时,那!

– KhogaEslam
20 Mar 16 '20 at 12:26

没问题。可能是其他答案重复的答案最终可能会被删除,我只是在确保人们在发生这种可能性之前有空间应对这种可能性;-)

–fra-san
20-3-16在17:47



#8 楼

清除历史记录后,您需要写入更改。而且,如果您不想在历史记录中使用历史记录擦除命令,则需要运行以下命令:

history -c && history -w && logout

祝你好运。

#9 楼

快速步骤:


使用echo $HISTFILE查找终端的历史文件在哪里

使用文本编辑器打开文件
删除找到的敏感行在那里
保存文件
关闭并重新打开终端机

完成:您的历史记录很干净!您可以通过在终端中运行history命令来验证这一点


#10 楼

在Ubuntu中(但我很确定,它将对其他Linux发行版和MacOS都适用),可以在任意文本编辑器中简单地编辑bash历史记录文件:

$ nano ~/.bash_history
/>
如果不知道它的存储位置,则可以按以下方式找到它:

$ echo $HISTFILE


或者您可以做更多一些通用方式:

$ nano $HISTFILE


评论


这没有考虑到退出shell时会将shell的当前内存历史记录写入文件。这不会从驻留在外壳程序的内存历史记录中的历史记录中删除命令。

– Kusalananda♦
20年4月2日在8:05

#11 楼

如果要删除一系列历史记录行,可以使用以下脚本。

本示例将删除第1行到第150行的历史记录输出。

 for i in `history | awk 'NR > 1 && NR <=150{print   }'`; do history -d $i; done