【发布时间】:2011-09-22 11:06:20
【问题描述】:
有时,当我运行rm -rf XYZ 之类的命令时,我不希望这被记录在 Bash 历史记录中,因为我可能会不小心再次通过reverse-i-search 运行相同的命令。有没有防止这种情况发生的好方法?
【问题讨论】:
-
虽然
bash可能用于编写shell脚本(因此是编程),但它的这个特殊方面与编程完全无关(历史只是互动的东西)。投票结束。
标签: bash
有时,当我运行rm -rf XYZ 之类的命令时,我不希望这被记录在 Bash 历史记录中,因为我可能会不小心再次通过reverse-i-search 运行相同的命令。有没有防止这种情况发生的好方法?
【问题讨论】:
bash 可能用于编写shell脚本(因此是编程),但它的这个特殊方面与编程完全无关(历史只是互动的东西)。投票结束。
标签: bash
我在我的.bashrc 中添加了“隐身”功能,当我想运行一些命令而不被保存而不必在每个命令之前添加空格时。
请注意,虽然当前终端会话的内存历史记录仍将被保存,但是当我打开 new 终端时,将永远不会看到在过去终端的隐身会话中发出的命令,因为他们从未写过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
}
不错的小实用程序,我认为有些人可能会发现它有用,您甚至可以更改提示以反映您是否处于隐身模式。
【讨论】:
kill -9 $$
我知道这不如以前的答案那么好,但这会杀死当前的 Bash shell 而不会保存任何东西,这在默认情况下未设置 HISTCONTROL、您忘记设置它或您忘记设置的纯粹和简单时很有用一个前导空格,而您只是输入了一些密码并且不希望它们永久保留在历史记录中。
这是一种快速的方法,但像擦除历史文件这样的操作并不那么好,因为您需要在历史保存 shell 之外执行此操作(以其他用户身份登录并使用 su/sudo、创建后台作业等)。 )
【讨论】:
更好地使用HISTIGNORE。这允许您指定一组要忽略的模式(例如rm)。 (我认为)这比将所有历史记录传输到 /dev/null 更好。
【讨论】:
如果您已将 HISTCONTROL 环境变量设置为 ignoreboth(通常默认设置),则带有前导空格字符的命令将不会存储在历史记录中(以及重复项)。
例如:
$ HISTCONTROL=ignoreboth
$ echo test1
$ echo test2
$ history | tail -n2
1015 echo test1
1016 history | tail -n2
man bash 是这样说的:
组织控制
以冒号分隔的值列表,用于控制命令在历史列表中的保存方式。如果值列表包含
ignorespace,以空格字符开头的行不会保存在历史列表中。ignoredups的值会导致不保存与前一个历史条目匹配的行。ignoreboth的值是ignorespace和ignoredups的简写。erasedups的值会导致与当前行匹配的所有先前行在保存该行之前从历史列表中删除。任何不在上述列表中的值都将被忽略。如果HISTCONTROL未设置,或者不包含有效值,则shell 解析器读取的所有行都将保存在历史列表中,以HISTIGNORE的值为准。多行复合命令的第二行及后续行不经过测试,无论HISTCONTROL的值如何,都会添加到历史记录中。
另见:
【讨论】:
在 shell 启动时,我明确地从我不想出现的条目中清除历史记录。例如,我不希望在历史记录中出现任何rm -rf(删除一个包含一夜之间处理的结果的目录后的创伤,只需要一个Arrow-Up + Enter :)
我将以下 sn-p 放入我的 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
【讨论】:
或者
unset HISTFILE
(类似于前面的答案,只是更短:export HISTFILE=/dev/null)
【讨论】:
您可以做以下两件事之一:
export HISTFILE=/dev/null
或者,以空格开始命令。
【讨论】:
ignorespace。
HISTFILE 可以防止存储任何历史记录,并且不会阻止将命令添加到内存历史记录中。
在你的 .bashrc/.bash_profile/任何你想要的地方,输入export HISTIGNORE=' *'。然后,只需以一个空格开始您想要忽略的任何命令。
$ ls # goes in history
$ ls # does not
【讨论】:
HISTCONTROL环境变量的值,不一定有ignorespace设置。
HISTCONTROL 包含ignorespace,实际上只是在HISTIGNORE 中包含` *` 是多余的。两者独立运作。