如何让zsh从历史记录中排除某些命令?

Joh*_*hir 4 zsh zshrc

例如,那些包含“生产”一词的产品?

ZyX*_*ZyX 5

function zshaddhistory() {
    emulate -L zsh
    if [[ $1 != *"production"* ]] ; then
        print -sr -- "${1%%$'\n'}"
        fc -p
    else
        return 1
    fi
}
Run Code Online (Sandbox Code Playgroud)

将以上内容放入交互式外壳启动时将源文件(.zshrc.zshrc像我一样来自源文件)。

替代形式(隐式添加到历史记录中):

function zshaddhistory() {
    emulate -L zsh
    if [[ $1 = *"production"* ]] ; then
        return 1
    fi
}
Run Code Online (Sandbox Code Playgroud)

。注意:

print -sr -- "${1%%$'\n'}"
Run Code Online (Sandbox Code Playgroud)

明确地将项目添加到历史记录。但是,如果zshaddhistory返回的退出代码为零,则zsh会隐式执行相同的操作,因此,不使用fc -p和使用setopt nohistignoredups nohistignorealldups(这是默认状态),您将在历史记录中看到不需要的重复项。

emulate -L zsh此处是为了确保不会进入仿真设置并更改功能主体的解释。我将此行放在我在zsh配置中定义的每个函数的开头。

  • 这对我不起作用...我尝试了许多排列。我还测试了分支的输入正确(如果条件正确)。但是该命令仍然被纳入历史记录。但这有效:`zshaddhistory(){[[$ 1!= * production *]]}` (2认同)