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