rm -rf XYZ
这样的命令时,我不想将其记录在 Bash 历史记录中,因为我可能会通过 反向搜索
再次意外运行相同的命令。有没有好的方法可以防止这种情况发生?rm -rf XYZ
这样的命令时,我不想将其记录在 Bash 历史记录中,因为我可能会通过 反向搜索
再次意外运行相同的命令。有没有好的方法可以防止这种情况发生?HISTCONTROL
环境变量设置为 ignoreboth
(通常是默认设置),具有前导空格字符的命令将不会存储在历史记录中(以及重复命令)。$ HISTCONTROL=ignoreboth
$ echo test1
$ echo test2
$ history | tail -n2
1015 echo test1
1016 history | tail -n2
以下是man bash
中的说明:
HISTCONTROL
一个由冒号分隔的值组成的列表,控制如何将命令保存在历史记录列表中。如果该值包括
ignorespace
,则以空格字符开头的行不会保存在历史记录列表中。值为ignoredups
会导致与前一个历史记录匹配的行不会被保存。值为ignoreboth
相当于ignorespace
和ignoredups
。值为erasedups
会导致从保存当前行之前,所有与当前行匹配的历史记录都被从历史记录列表中删除。以上列表中没有的任何值都将被忽略。如果未设置HISTCONTROL
或未包含有效值,则由 shell 解析器读取的所有行都将保存在历史记录列表中,取决于HISTIGNORE
的值。多行复合命令的第二行及其后续行不会被测试,并且无论HISTCONTROL
的值如何,它们都将添加到历史记录中。
另请参阅:
export HISTIGNORE=' *'
。然后,只需在要忽略的任何命令前加一个空格。$ ls # goes in history
$ ls # does not
HISTCONTROL
环境变量的值,它并不一定设置了 ignorespace
。 - sorpigalHISTCONTROL
包含ignorespace
,那么在HISTIGNORE
中包括 *
实际上是多余的。这两个变量是独立操作的。 - chepner更好的方式是使用 HISTIGNORE
。这允许您指定要忽略的一组模式(例如 rm
),相比仅将所有历史记录导向/dev/null
,我认为这样效果更佳。
kill -9 $$
我知道这并不是最好的答案,但这将会强制终止当前的Bash shell而不保存任何东西,在HISTCONTROL没有被默认设置、您忘记设置它或者仅仅是忘记在输入一些密码时加上前导空格且不希望它们长久地保留在历史记录中时非常有用。
这是一个快速的方法,像删除历史记录文件这样的操作并不好,因为您需要在一个不保存历史记录的shell之外进行(以不同的用户登录并使用su/sudo,创建后台作业等)。
你可以选择以下两种方式之一:
export HISTFILE=/dev/null
或者,在命令前加一个空格。
ignorespace
。 - sorpigalHISTFILE
,可以防止存储任何历史记录,但不会阻止将命令添加到内存中的历史记录。 - chepner或者
unset HISTFILE
我在我的 .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
}
我认为一些人可能会发现这个小工具很有用,你甚至可以更改提示以反映是否处于隐身模式。
history -d <offset>
删除这些行。或者只需使用history -c
并从内存中清除整个列表。 - SpinUp __ A Davisexec $SHELL
作为一个好的“退出隐身模式”的方法吗? - Lockszmithexec $SHELL
作为一个好的“退出隐身”方法吗? - undefined在启动 shell 时,我会明确清理那些我不想留在历史记录中的条目。例如,我不希望历史记录中有任何 rm -rf
命令(因为曾经有一次我误删了整个夜间处理结果的目录,只是因为按了一下 向上箭头
+ 回车
:)
我在我的初始化文件中加入了以下片段(适用于 .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
bash
可以用于编写shell脚本(因此也算是编程),但它与编程毫无关系(历史只是交互式的东西)。投票关闭。 - paxdiablo