HISTORY_IGNORE 中的语法?

HISTORY_IGNORE 中的语法?

我试图忽略一些敏感命令,使其不被保存在 zsh 的历史文件中。

HISTSIZE=1000                 # 1000 lines of history within the shell
SAVEHIST=1000                 # 1000 lines of history in $HISTFILE
HISTFILE=${HOME}/.zsh_history # Save history to ~/.zsh_history
## Ignore save in $HISTFILE, but still in the shell
HISTORY_IGNORE='([bf]g *|cd ..|l[a,l,s,h,] *|less *|vi[m,] *)'

但它仍然显示在历史文件中:

% rm .zsh_history 
% ls              
Desktop  Documents  Downloads  Music  peda  Pictures  Public  Templates  Videos
% l
Desktop/  Documents/  Downloads/  Music/  peda/  Pictures/  Public/  Templates/  Videos/
% cat .zsh_history
ls
l
cat .zsh_history

我已经阅读参数页面,但它没有帮助。

该部分l[a,l,s,h,] *正确吗?

答案1

l[a,l,s,h,] *不匹配,l因为[]不是要扩展为的逗号分隔列表 - 这是括号扩展的语法。[...],与[a,l,s,h,]相同,[alsh,]并不意味着任何alsh或什么都没有。 您需要l[alsh]#

对于ls,空格似乎破坏了这种匹配,即使其后的所有内容都是可选的。因此在实践中,这似乎ls只有在带有参数时才会被忽略:

~ ls foo
ls: cannot access 'foo': No such file or directory
~ tail ~/.histfile
HISTORY_IGNORE='([bf]g *|cd ..|l[a,l,s,h,]*|less *|vi[m,] *)'
l
tail ~/.histfile
l
tail ~/.histfile

看来您*也需要做出可选的:

HISTORY_IGNORE='([bf]g *|cd ..|l[alsh]#( *)#|less *|vim# *)'

相关内容