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

时间:2012-01-27 19:44:46

标签: bash

我注意到,当打开.bash_history时它只包含我之前会话中的条目时,似乎只在退出时附加当前会话。有没有办法阻止当前会话保存?如果知道如何做,那么即使崩溃bash也是一种选择。我发现我可以kill -9这个过程,但如果有更好的方式我想知道。

7 个答案:

答案 0 :(得分:65)

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

答案 1 :(得分:64)

取消设置$HISTFILE变量

$ unset HISTFILE
  

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

答案 2 :(得分:13)

我知道这是一个老线程。只想添加它以完成:

如果您只想要保存特定命令,请检查是否设置了HISTCONTROL变量: HISTCONTROL=ignoreboth 要么 HISTCONTROL=ignorespace

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

只需2美分。

答案 3 :(得分:12)

还有另一个选项,类似于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:~$

答案 4 :(得分:8)

应该这样做:

HISTFILE=

取消设置HISTFILE。

答案 5 :(得分:7)

以下适用于我。

 export HISTFILE=/dev/null 

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

答案 6 :(得分:4)

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

退出bash,不写任何东西

kill -9 $$

这很容易进取。但这是结束间谍活动的一种有趣方式。

从内存中清除历史记录

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。 ,您必须用双引号将子Shell引起来,因为history 1不仅返回数字,还返回命令及其参数,并且每个循环都将在for循环中得到一个单独的循环。但是,现在这变成了bash课,我会停下来。