How do I prevent commands from showing up in Bash history?

Sometimes, when I run commands like rm -rf XYZ, I don't want this to be recorded in Bash history, because I might accidentally run the same command again by reverse-i-search. Is there a good way to prevent this from happening?

65606 次浏览

你可以做两件事:

export HISTFILE=/dev/null

或者,命令以空格开头。

最好用 HISTIGNORE。这允许您指定一组要忽略的模式(例如 rm)。这是更好的(我认为)比只管道所有的历史到 /dev/null

在你的. bashrc/. bash _ profile/任何你想要的地方,放入 export HISTIGNORE=' *',然后用一个空格开始任何你想忽略的命令。

$ ls  # goes in history
$  ls # does not

或者

unset HISTFILE

(similar to the previous answer only shorter: export HISTFILE=/dev/null)

At shell startup, I explicitly cleanup the history from the entries that I don't want to be there. For example, I don't want any rm -rf in the history (it's trauma after removing a directory full of results processed overnight, just with a single 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

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

例如:

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

Here is what man bash says:

组织控制

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

参见:

kill -9 $$

我知道这不如前面的答案好,但是这会在没有保存任何东西的情况下杀死当前的 Bash shell,当 HISTCONTROL 不是默认设置的时候很有用,你忘了设置它,或者纯粹是简单的你忘了放置一个前导空格,你只是输入了一些密码,不希望它们永久保存在历史中。

这是一种快速的方法,但是像擦除历史文件这样的事情就没有那么好了,因为您需要在历史保存 shell 之外进行擦除(以不同的用户身份登录并使用 su/sudo,创建一个后台作业等等)

我在我的 .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
}

不错的小工具,我想有些人可能会用到,你甚至可以改变提示来反映你是否处于隐身模式。