如何防止命令显示在bash历史?

有时,当我运行像rm -rf XYZ这样的命令时,我不希望将它logging在bash历史logging中,因为我可能不小心通过reverse-i-search再次运行相同的命令。 有没有防止这种情况发生的好方法?

如果您已将HISTCONTROL环境variables设置为ignoreboth (通常默认设置),则具有前导空格字符的命令将不会存储在历史logging中(以及重复项)。

例如:

 $ HISTCONTROL=ignoreboth $ echo test1 $ echo test2 $ history | tail -n2 1015 echo test1 1016 history | tail -n2 

这是什么man bash说:

HISTCONTROL

一个以冒号分隔的值列表,控制如何将命令保存在历史列表中。 如果值列表包含ignorespace 空间,则以空格字符开头的行不会保存在历史logging列表中ignoredups的值会导致与以前的历史logging匹配的行不被保存。 ignoreboth的值是ignorespaceignoredups简写。 erasedups的值会导致在保存该行之前,将所有与当前行匹配的以前的行从历史列表中删除。 不在以上列表中的任何值都将被忽略。 如果未设置HISTCONTROL或未包含有效值,则shellparsing器读取的所有HISTIGNORE保存在历史logging列表中,取决于HISTIGNORE的值。 多行复合命令的第二行和后续行不进行testing,并添加到历史logging,而不pipeHISTCONTROL的值。

也可以看看:

  • 为什么bash不存储以空格开头的命令? 在unix SE
  • 为什么bash有一个HISTCONTROL =忽略空间选项? 在unix SE

在你的.bashrc / .bash_profile /你想要的地方,把export HISTIGNORE=' *' 。 然后,只需要开始任何你想要忽略的命令。

 $ ls # goes in history $ ls # does not 

更好的使用HISTIGNORE 。 这允许您指定一组要忽略的模式(如rm )。 更好(我认为),而不是只是将所有历史loggingpipe理到/dev/null

你可以做两件事之一:

 export HISTFILE=/dev/null 

或者,用一个空格开始命令。

要么

 unset HISTFILE 

(与之前的回答类似,只是更短一些:export HISTFILE = / dev / null)

在shell启动时,我明确地清除了我不想在那里的条目的历史logging。 例如,我不想在历史中使用任何rm -rf (在删除一个完整的结果的目录后,只需使用一个Arrow-Up + Enter 🙂

我把下面的代码片段放在我的init文件中(与.zshrc工作,也应该和.bashrc工作)

 # ... HISTFILE=~/.zshhistory # ... # remove dangerous entries from the shell history temp_histfile="/tmp/$$.temp_histfile" grep -v -P '^rm .*-rf' $HISTFILE > $temp_histfile mv $temp_histfile $HISTFILE