不要将当前的bash会话保存到历史记录


74

我注意到在打开时.bash_history它仅包含上一个会话的条目,似乎当前会话仅在退出时附加。有什么方法可以防止当前会话保存?bash如果知道如何崩溃,甚至可以选择崩溃。我发现可以进行kill -9此过程,但是如果有更好的方法,我想知道。


3
一种实现此目的的方法是使用kill -9 $$。通过向您的终端发送SIGKILL,就没有机会写入历史文件。
jordanm 2012年

我已经总结了所有内容,并在此答案中提供了更多背景信息stackoverflow.com/a/52208927/117471
Bruno Bronosky

Answers:


88

使用history -c命令清除当前会话的历史记录可能比崩溃bash更为优雅。然后,就没有什么可保存的(它甚至可以从历史记录中删除自己)。


7
那也将破坏histfile的内容。
Michael Krelin-黑客2012年

1
不适合我 也许在某个时候改变了吗?我正在使用bash 4.2。
FatalError 2012年

谢谢,这似乎是最干净的方法!
dotancohen 2012年

8
在bash 4.3.39上,history -c不仅清除当前会话的历史记录。当bash启动时,它还将清除从历史文件的开头读取的历史记录。如果您将要关闭bash,这并不重要。这仅在内存的历史记录缓冲区中-实际上不会擦除历史记录文件(可能是.bash_history)。即使您完全退出bash,它也不会破坏历史文件。因此,如果您不退出bash,则可以在其后面加上ahistory -r以重新读取历史记录文件。可悲的是,history -cr两者不能同时进行。
user1902689

1
@BrunoBronosky,我没有理由难以置信,但是我想我在五年前确实进行了测试,然后再进行上述连接。并不是我真的记得。可能与其他设置有关,并且系统默认设置有所不同或已更改…
Michael Krelin-黑客

91

取消设置$HISTFILE变量

$ unset HISTFILE

如果未设置HISTFILE或历史记录文件不可写,则不会保存历史记录。
http://www.faqs.org/docs/bashman/bashref_106.html


1
谢谢,这对于在-c上删除整个历史记录的Bash版本很有用。
dotancohen 2012年

vs vs的好处是什么history -r,因为这样您将失去自登录后所做的所有工作。但是,这样做将失去您在会话中要做的所有事情
Pylinux

@Pylinux如果您要在命令行中执行诸如输入密码之类的操作,那么您可能要确保如果在记得擦除历史记录之前不小心关闭了会话,则不会保存要执行的操作。
Malvineous

@Malvineous到目前为止,最常见的用例是:没有通知Thermalinal而不是浏览器,而是在终端中意外地写了密码,现在我必须经过自我检查才能清理:-)
Pylinux

19

我知道这是一个旧线程。只是想添加此内容以完成操作:

如果只希望不保存特定命令,请检查是否HISTCONTROL设置了变量: HISTCONTROL=ignorebothHISTCONTROL=ignorespace

每个以前导空格开头的命令都不会放入历史记录中。

只是我的2美分。


真不错!
Jimmy Koerting

1
ignoreboth也不会放重复行,ignorespace会放重复行。
五彩纸屑

15

还有一个类似于的选项,history -c但是不会擦除当前会话之前的任何内容。

history -r,它从中重新加载历史记录HISTFILE,就像您刚刚登录一样。

我不知道这是否可行,或者在4.3.11之前的任何bash版本中都可用,但是我将其包括在列表中会很有用。

这是显示此命令与命令之间的区别的示例-c

user@host:~$ # I Just logged in
user@host:~$ history | tail -n6 # this shows commands from the previous session, which ends at item 4682 as well as from the current one
 4679  2014-08-23 17:15:29 # Previous session
 4680  2014-08-23 17:15:33 # Still the previous session
 4681  2014-08-23 17:15:37 # note the datetime
 4682  2014-08-23 17:15:44 exit
 4683  2014-08-23 17:17:25 # I Just logged in
 4684  2014-08-23 17:19:54 history | tail -n6 # this shows the last command, and the ones from the previous session
user@host:~$ # This is a secret command, so I need to remove the traces of this session
user@host:~$ history -r
user@host:~$ history | tail -n5 # Note that I went back to item 4682, and there are no traces of history -r command
 6242  2014-08-23 17:15:29 # Previous session
 6243  2014-08-23 17:15:33 # Still the previous session
 6244  2014-08-23 17:15:37 # note the datetime
 6245  2014-08-23 17:15:44 exit
 6246  2014-08-23 17:22:26 history | tail -n5 # Note that I went back to item 4682, and there are no traces of history -r command
user@host:~$ history -c # instead if I issue history -c
user@host:~$ history # everything disappears
 5248  2014-08-23 17:23:13 history # everything disappears
user@host:~$

在bash 4.3.39上,history -r将历史记录文件的内容追加到当前历史记录列表中。当您发布答案时,无法确定这是在做什么。历史数字在您的命令之间跳跃了很多,但不要翻倍。
user1902689

您确定要附加它们吗?在bash 4.3.11中,数字会向前跳转,因为未重置计数器,但实际上并未将内容附加到原始计数器上。的确,如果您注销并登录,这些数字将返回其原始状态。
卡莱斯·萨拉2015年

11

这是您的bash历史记录工具包...

不写任何内容即可退出bash

kill -9 $$

这是hacky和侵略性的。但这是结束间谍活动的一种有趣方式。

从内存中清除历史记录

history -c

这将清除内存所有历史。如果您按下向上箭头,您将一无所获。您$HISTFILE没有动过。你可以用...证明

从磁盘重新加载历史记录

history -r

这会重新读取$HISTFILE并将其附加到内存中的历史记录(如果有的话)。您可以在执行此操作后history -c重新获得使用Ctrl+R搜索或向上箭头查找先前命令的功能。(您可以执行此操作,而不是注销并重新登录)。

注意:如果您没有先清除历史记录,则只会附加到内存中的当前历史记录。这将掩盖历史,因此几次按下向上箭头可以让您感到想隐藏的东西已经消失了。实际上,除非它比您$HISTSIZE或者更深,否则它只是被掩埋并将写入磁盘$HISTFILESIZE

执行命令而不将其包含在历史记录中

echo foo bar baz; history -d $(history 1)

这用于history -d按数字删除条目。由于仅使用第一个参数(其他参数将被忽略),因此我们可以使用的输出history 1(与相同history | tail -n 1)来获取当前条目的编号。

由于bash oneliners是单个历史记录条目,因此您可以执行多个命令,如下所示:

echo foo; echo bar; echo baz; history -d $(history 1)

这也适用:

echo foo \
bar \
baz; history -d $(history 1)

即使这样有效:

for x in foo bar baz; do
echo $x
done; history -d $(history 1)

从历史记录中删除密码(命令等)

如果您只关心消除单个条目,则可以创造性地使用前面的示例。使用history找到要删除的条目的数量。然后按编号删除它。例如...

$ history
  1  pwd
  2  date
  3  sudovisudo
  4  hunter2
  5  man history
  6  help history
  7  history
$ history -d 4

希望我不必告诉您这一点,但以防万一:不要grep您的密码历史记录。如果您“确实需要”搜索历史记录,请执行history | LESSHISTFILE=/dev/null less,并明确进行/搜索。

如果您真的很尴尬,并且不想有任何删除历史记录的记录,则可以将此概念与上一个合并。

history -d 4; history -d $(history 1)

或者也要摆脱原来的错误...

for n in "$(history 1)" 4 3; do history -d $n; done

请注意,您必须按降序循环输入条目号,因为每次调用都会history -d将条目从列表中弹出,而所有后续条目的号都会减少1。而且,您必须用双引号括住子外壳,因为history 1返回的不仅是数字,以及命令及其参数,并且每个都将在循环中获得一个单独的for循环。但是现在这变成了一个bash教训,我将停止。



7

以下对我有用。

 export HISTFILE=/dev/null 

请注意,它前面有一个空间。大多数现代发行版都不会添加在空格后面输入的命令来打击历史记录。这将阻止该行也出现在您的历史记录中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.