假设我使用zsh运行了一个命令
echo "mysecret" > file
我可以使用以下命令轻松打印历史记录,包括条目号fc -l
:
1 echo "mysecret" >| file
但是,如何轻松从历史记录中删除条目?
我在man zshbuiltins中找不到相应的段落。
Answers:
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可以防止“非法字节序列”失败。
sed -i '' '/S3_SECRET/d' $HISTFILE
。这在Linux上不起作用。stackoverflow.com/questions/5694228/...
LC_ALL=C sed -i '' '/S3_SECRET/d' $HISTFILE
stackoverflow.com/questions/11287564/...
我不知道是否有某种优雅的方法可以执行此操作,但是在类似情况下,我已经注销(允许zsh清空其缓冲区并将我的历史记录写入文件),然后登录并最终手动编辑 ~/.zsh_history
,删除“危险”行。
HISTFILE=/dev/null
,或者仅使用另一个外壳程序。如果zsh
是登录shell,请登录和exec sh
,然后进行编辑~/.zhistory
。
~/.zsh_history
,然后重新启动zsh。
如果在zsh中使用HIST_IGNORE_SPACE选项,则可以在命令前添加空格“”,并且这些命令将不会在历史记录文件中记住。如果您有常用的秘密命令,则可以执行以下操作:alias hiddencommand ='hiddencommand'。
setopt histignorespace
您的~/.zshrc
histignorespace
。很有用 !
此功能将从Zsh历史记录中删除您想要的任何一行,而不会出现任何问题:
# Accepts one history line number as argument.
# Alternatively, you can do `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
在bash中:
1 in bash终端类型
hsitory
#这将列出历史记录.bash_history文件中所有带有行号的命令
例如:
...
987 cd
988 ssh x@127.0.0.1
990 exit
991 cd
2-选择要删除的CMD行号
history -d 988
注意:例如,如果要删除最后3个CMD,只需从底部ex:988中选择第三行号,然后history -d 988
依次重复CMD 3次。
history -d
在ZSH中不起作用,因为它只是其别名,fc -l 1
并且以fc: event not found: -d
错误结尾。