假设我使用 zsh 运行了一个命令
echo "mysecret" > file
我可以使用命令
fc -l
: 轻松打印历史记录,包括条目编号
1 echo "mysecret" >| file
但是如何轻松地从历史记录中删除条目呢?
我在 man zshbuiltins 中找不到相应的段落。
LC_ALL=C sed -i '' '/porn/d' $HISTFILE
LC_ALL=C sed -i '/porn/d' $HISTFILE
这将从您的 $HISTFILE 中删除所有与“porn”匹配的行。
使用
setopt HIST_IGNORE_SPACE
,您可以在上述命令前面添加一个空格字符,以防止其被写入 $HISTFILE。
正如 Tim 在下面的评论中指出的那样,前缀 LC_ALL=C 可以防止“非法字节序列”失败。
我不知道是否有一些优雅的方法可以做到这一点,但在类似的情况下,我已经注销(允许 zsh 清空其缓冲区并将我的历史记录写入文件),然后登录,最后手动编辑
~/.zsh_history
,删除“危险”线。
如果您在 zsh 中使用 HIST_IGNORE_SPACE 选项,您可以在命令前面加上空格“”,它们将不会被记住在历史文件中。如果您有常用的秘密命令,您可以执行以下操作:alias hidecommand='hiddencommand'。
如果您只想进行偶尔删除,我认为手动编辑您的
.zsh_history
更容易。
在 zsh 终端中:
~/.zsh_history
,history
,不需要的历史记录项目就会消失。(确保编辑器没有备份之前的.zsh_history实例。)
(基于https://til.hashrocket.com/posts/zn87awopb4-delete-a-command-from-zsh-history-的解决方案)
此功能将从您的 Zsh 历史记录中删除您想要的任何一行,不问任何问题:
# Accepts one history line number as argument.
# Use `dc -1` to remove the last line.
dc () {
# Prevent the specified history line from being
# saved.
local HISTORY_IGNORE="${(b)$(fc -ln $1 $1)}"
# Write out the history to file, excluding lines that
# match `$HISTORY_IGNORE`.
fc -W
# Dispose of the current history and read the new
# history from file.
fc -p $HISTFILE $HISTSIZE $SAVEHIST
# TA-DA!
print "Deleted '$HISTORY_IGNORE' from history."
}
如果您还想防止所有
dc
命令写入历史记录,请在 ~/.zshrc
文件中添加以下内容:
zshaddhistory() {
[[ $1 != 'dc '* ]]
}
我现在发布了一个更全面的解决方案作为插件:https://github.com/marlonrichert/zsh-hist
tldr:
vi $HISTFILE
更多详情:
奔跑
vi $HISTFILE
SHIFT + g — 转到末尾
dd — 删除线
:wq — 保存并退出
重新加载会话或打开新选项卡以查看更改
只需摆脱你的 shell,而不让它正常关闭。
kill -9 $$