如何从ZSH的历史记录中删除条目

问题描述 投票:0回答:7

假设我使用 zsh 运行了一个命令

echo "mysecret" > file

我可以使用命令

fc -l
:

轻松打印历史记录,包括条目编号
1  echo "mysecret" >| file

但是如何轻松地从历史记录中删除条目呢?

我在 man zshbuiltins 中找不到相应的段落。

zsh
7个回答
138
投票

*BSD/Darwin (macOS):

LC_ALL=C sed -i '' '/porn/d' $HISTFILE

Linux(GNU sed):

LC_ALL=C sed -i '/porn/d' $HISTFILE

这将从您的 $HISTFILE 中删除所有与“porn”匹配的行。

使用

setopt HIST_IGNORE_SPACE
,您可以在上述命令前面添加一个空格字符,以防止其被写入 $HISTFILE。

正如 Tim 在下面的评论中指出的那样,前缀 LC_ALL=C 可以防止“非法字节序列”失败。


91
投票

我不知道是否有一些优雅的方法可以做到这一点,但在类似的情况下,我已经注销(允许 zsh 清空其缓冲区并将我的历史记录写入文件),然后登录,最后手动编辑

 ~/.zsh_history
,删除“危险”线。


47
投票

如果您在 zsh 中使用 HIST_IGNORE_SPACE 选项,您可以在命令前面加上空格“”,它们将不会被记住在历史文件中。如果您有常用的秘密命令,您可以执行以下操作:alias hidecommand='hiddencommand'


15
投票

如果您只想进行偶尔删除,我认为手动编辑您的

.zsh_history
更容易。

在 zsh 终端中:

  1. 使用要删除的命令关闭终端会话。
  2. 打开一个新会话,
  3. 使用文本编辑器(pico、Emacs、vim...)打开
    ~/.zsh_history
  4. 删除有问题的线路,
  5. 关闭编辑器,关闭终端会话并打开一个新的,
  6. 输入
    history
    ,不需要的历史记录项目就会消失。

(确保编辑器没有备份之前的.zsh_history实例。)

(基于https://til.hashrocket.com/posts/zn87awopb4-delete-a-command-from-zsh-history-的解决方案)


9
投票

此功能将从您的 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


8
投票

tldr:

vi $HISTFILE

更多详情:

奔跑

vi $HISTFILE

SHIFT + g — 转到末尾

dd — 删除线

:wq — 保存并退出

重新加载会话或打开新选项卡以查看更改


0
投票

只需摆脱你的 shell,而不让它正常关闭。

kill -9 $$
© www.soinside.com 2019 - 2024. All rights reserved.