Don';t将当前bash会话保存到历史记录

Don';t将当前bash会话保存到历史记录,bash,Bash,我注意到,当打开.bash\u history时,它只包含我上一个会话中的条目,似乎只有在退出时才会追加当前会话。是否有任何方法阻止保存当前会话?即使是崩溃bash也是一种选择,如果你知道怎么做的话。我发现我可以kill-9进程,但是如果有更好的方法,我想知道。取消设置$HISTFILE变量 $ unset HISTFILE 如果HISTFILE未设置,或者历史文件不可写入,则不会保存历史。 使用history-c命令清除当前会话的历史记录可能比崩溃bash更优雅。然后,就没有什么可保存的了

我注意到,当打开
.bash\u history
时,它只包含我上一个会话中的条目,似乎只有在退出时才会追加当前会话。是否有任何方法阻止保存当前会话?即使是崩溃
bash
也是一种选择,如果你知道怎么做的话。我发现我可以
kill-9
进程,但是如果有更好的方法,我想知道。

取消设置
$HISTFILE
变量

$ unset HISTFILE
如果HISTFILE未设置,或者历史文件不可写入,则不会保存历史。


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

这应该可以:

HISTFILE=

取消设置历史文件。

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

以下内容适合我

 export HISTFILE=/dev/null 

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

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

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

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


就我的2美分。

这是您的bash历史工具包

不写任何东西就退出bash 这是黑客和侵略性的。但这是结束间谍活动的有趣方式

从记忆中清除历史 这将清除所有历史记录的内存。如果你按向上箭头,你什么也得不到。您的
$HISTFILE
未被触动。你可以用……来证明这一点

从磁盘重新加载历史记录 这将重新读取
$HISTFILE
,并将其附加到内存中的历史记录中(如果有)。您可以在
history-c
之后执行此操作,以恢复对以前的命令执行Ctrl+R搜索或向上箭头的功能。(您可以这样做,而不是注销和重新登录)

注意:如果您没有首先清除历史记录,这只会附加到内存中的当前历史记录。这将掩盖历史,因此点击向上箭头几次会让你感到安慰,因为你想隐藏的东西已经不见了。实际上,它只是被掩埋并将被写入磁盘,除非它比
$HISTSIZE
$HISTFILESIZE
更深

执行命令时不将其包含在历史记录中 这将使用
history-d
按编号删除条目。由于只使用第一个参数(其他参数被忽略),我们可以使用
history 1
(与
history | tail-n1
)的输出来获取当前条目的编号

因为bash OneLiner是单个历史记录条目,所以您可以执行以下多个命令:

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
我希望我不必告诉你这一点,但以防万一:不要将历史记录作为密码。如果你“真的”需要搜索历史记录,请执行
history | LESSHISTFILE=/dev/null less
,并显式执行
//code>搜索

如果你真的很尴尬,希望没有你从历史中删除某些东西的记录,你可以将这个概念与最后一个概念结合起来

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
课程,我将停止。

这也会破坏histfile的内容。对我来说不是这样。也许它在某个时候改变了?我正在使用Bash4.2。谢谢,这似乎是最干净的方法!在Bash4.3.39上,
history-c
不仅仅清除当前会话的历史记录。它还清除bash启动时从历史文件开始读取的历史。如果您即将关闭bash,这并不重要。这只存在于内存中的历史缓冲区中-它实际上不会擦除历史文件(可能是.bash_history)。即使您干净地退出bash,它也不会破坏历史文件。因此,如果您没有退出bash,可以使用
history-r
来重新读取历史文件。遗憾的是,
history-cr
并不能同时完成这两项功能。@BrunoBronosky,我没有理由不相信,但我想我确实在五年前测试过它,然后再连接上面的内容。我真的不记得了。也许这与其他设置有关,系统默认值不同或已更改…实现这一点的一种黑客方法是使用
kill-9$$
。通过向终端发送SIGKILL,它没有机会写入历史文件
for x in foo bar baz; do
echo $x
done; history -d $(history 1)
$ history
  1  pwd
  2  date
  3  sudovisudo
  4  hunter2
  5  man history
  6  help history
  7  history
$ history -d 4
history -d 4; history -d $(history 1)
for n in "$(history 1)" 4 3; do history -d $n; done