如何防止命令出现在Bash历史记录中?

时间:2011-06-25 03:01:44

标签: bash

有时,当我运行rm -rf XYZ之类的命令时,我不希望将其记录在Bash历史记录中,因为我可能会不小心再次reverse-i-search运行相同的命令。有没有好办法防止这种情况发生?

8 个答案:

答案 0 :(得分:75)

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

例如:

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

以下是man bash所说的内容:

  

HISTCONTROL

     

以冒号分隔的值列表,用于控制命令在历史记录列表中的保存方式。如果值列表包含ignorespace,则以空格字符开头的行不会保存在历史记录列表中。值ignoredups导致与先前历史记录条目匹配的行不被保存。值ignorebothignorespaceignoredups的简写。值erasedups会导致在保存该行之前从历史列表中删除与当前行匹配的所有先前行。忽略上面列表中没有的任何值。如果未设置HISTCONTROL,或者未包含有效值,则shell解析器读取的所有行都将保存在历史记录列表中,但值为HISTIGNORE。多行复合命令的第二行和后续行未经过测试,无论HISTCONTROL的值如何都会添加到历史记录中。

另见:

答案 1 :(得分:43)

在你的.bashrc / .bash_profile /中,放置export HISTIGNORE=' *'。然后用一个空格开始你想要忽略的任何命令。

$ ls  # goes in history
$  ls # does not

答案 2 :(得分:20)

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

答案 3 :(得分:7)

你可以做以下两件事之一:

export HISTFILE=/dev/null

或者,用空格开始命令。

答案 4 :(得分:5)

kill -9 $$

我知道这不像上面那样最好,但这会杀死当前的bash shell而不保存任何东西,当默认情况下没有设置HISTCONTROL时很有用,你忘了设置它或纯粹而简单你忘了放一个前导空格你刚输入一些密码并且不希望它们永久保留在历史记录中,这是一种快速的方法,比如擦除历史文件并不是那么好,因为你需要在历史保存shell之外执行它(登录为不同的用户和使用su / sudo,创建后台工作等。)

答案 5 :(得分:3)

或者

unset HISTFILE

(类似于前面的答案只有更短:export HISTFILE = / dev / null)

答案 6 :(得分:2)

我在 .bashrc 中添加了“隐身”功能,当我想在不保存的情况下运行某些命令而不必在每个命令之前添加空格时。

请注意,虽然当前终端会话的内存历史记录仍将被保存,但是当我打开一个终端时,将永远不会看到在过去终端的隐身会话中发出的命令,因为它们从未被写入 HISTFILE

致您的.bashrc

ignoreHistory="false"
DEFAULT_HISTFILE=~/.bash_history
HISTFILE="$DEFAULT_HISTFILE"

# Toggle incognito mode
incognito() {
    if [[ "$ignoreHistory" == "true" ]]; then
        echo -e "\e[33mExited incognito mode\e[39m"
        ignoreHistory="false"
        HISTFILE="$DEFAULT_HISTFILE"
    else
        echo -e "\e[33mEntered incognito mode\e[39m"
        ignoreHistory="true"
        HISTFILE=/dev/null
    fi
}

我认为有些人可能会发现这个不错的小实用程序,您甚至可以更改提示以反映您是否处于隐身模式。

答案 7 :(得分:1)

在shell启动时,我明确地从我不想在那里的条目中清除历史记录。例如,我不希望历史记录中有任何rm -rf(删除过夜处理完整结果的目录后只会出现创伤,只需一个Arrow-Up + Enter:)

我将以下代码段放在我的初始文件中(与.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