将命令参数转换为历史搜索模式

将命令参数转换为历史搜索模式

我有一个别名,只需输入 h + 搜索模式即可快速搜索我的终端历史记录。 alias h='history | /usr/bin/grep '

它的工作方式应该如此,但如果不添加更多的 grep 实例,我就无法添加更多的搜索模式。例如h pacman | grep wine

我想调整它以将其他可能的参数转换为搜索模式。例如h pacman wine

Obs.:我知道有现成的解决方案可以实现这一目标,但由于我不知道如何做到这一点,所以我想学习。

答案1

为此,您需要一个 shell 函数而不是 shell 别名:

function h() {
  code="cat ~/.bash_history"
  for arg in $@ ; do
    code="$code | grep $arg"
  done
  eval "$code"
}

您可以将此函数放在您的.bashrc别名指令中或您通常编写别名指令的任何位置。

答案2

这里的关键是,对于多个模式grep,您通常必须使用-e选项来指定每个模式(因此grep -e pacman -e wine而不是仅仅grep pacman wine)。两种选择:

  1. 别名不支持参数,因此使用函数:

    h () {
        local args=()   # local array to store argument with -e for grep
        for i
        do
           args+=(-e "$i")  # tack on the -e for each argument
        done
        history | grep "${args[@]}"
    }
    

    这假设所有参数都是 的模式grep

  2. 继续使用别名,并添加-e您自己的:

     h -e pacman -e wine
    

    这样,您还可以添加grep您想要的任何其他选项(例如,-C 3显示结果周围的一些上下文)。

相关内容