如果我不小心在 bash 中输入了密码或其他敏感信息,我可以轻松地用 删除该行history -d ROW#
,但历史记录中的命令始终会向history -d ROW#
所有人显示有人更正了错误。
我可以将一些内容附加到命令中以防止其出现在 bash 历史记录中吗?
答案1
如果不想在历史记录中保存单个命令,只需在命令前加上空格(标记为␣
这里):
$ echo test
test
$ history | tail -n2
3431 echo test
3432 history | tail -n2
$ ␣echo test2
test2
$ history | tail -n2
3431 echo test
3432 history | tail -n2
此行为在您的文件中设置~/.bashrc
,即在以下行中:
HISTCONTROL=ignoreboth
man bash
说:
HISTCONTROL
用冒号分隔的值列表,控制命令在历史列表中的保存方式。如果值列表包括 忽略空间, 以空格字符开头的行不会保存在历史列表中. 值为被忽略的 导致与前一个历史记录条目匹配的行不被保存。 忽略两者是简写忽略空间和被忽略的。
ignoredups
history | tail -n2
顺便说一下这就是为什么在上述测试中历史记录中只出现一次的原因。
终端的历史记录保存在 RAM 中,并~/.bash_history
在您关闭终端后立即刷新到您的终端。如果您想从终端中删除特定条目,~/.bash_history
可以使用以下命令sed
:
# print every line…
sed '/^exit$/!d' .bash_history # … which is just “exit”
sed '/^history/!d' .bash_history # … beginning with “history”
sed '/>>log$/!d' .bash_history # … ending with “>>log”
sed '\_/path/_!d' .bash_history # … containing “/path/” anywhere
在最后一个中,我将默认分隔符更改/
为 ,_
因为它在搜索词中使用,实际上这等于sed -i '/\/path\//d' .bash_history
。如果命令仅输出要删除的行,请添加选项-i
并更改!d
为d
以执行删除:
# delete every line…
sed -i '/^exit$/d' .bash_history # … which is just “exit”
sed -i '/^history/d' .bash_history # … beginning with “history”
sed -i '/>>log$/d' .bash_history # … ending with “>>log”
sed -i '\_/path/_d' .bash_history # … containing “/path/” anywhere
答案2
一种方法是设置HISTIGNORE
环境变量。从man bash
HISTIGNORE
A colon-separated list of patterns used to decide which command
lines should be saved on the history list. Each pattern is
anchored at the beginning of the line and must match the com‐
plete line (no implicit `*' is appended). Each pattern is
tested against the line after the checks specified by HISTCON‐
TROL are applied.
[FWIW,默认HISTCONTROL
提供在前面输入空格的解决方法]。
例如
HISTIGNORE='history -d*'
如果你希望它是持久的,请将其从你的~/.bashrc
export HISTIGNORE='history -d*'
答案3
答案4
如果要运行命令而不将其保存在历史记录中,请在命令前面添加一个空格
prompt$ echo saved
prompt$ echo not saved \
> # ^ extra space
要使此功能正常工作,您需要在 HISTCONTROL 中使用 ignorespace 或 ignoreboth。例如,运行
HISTCONTROL=ignorespace 要使此设置持久,请将其放入您的 .bashrc 中。