使用其他别名+参数调用alias

使用其他别名+参数调用alias

我试图总结 grep,同时能够给出另一个带参数的命令,但我不知道如何让它工作我正在做的是这个

alias pac='sudo pacman'

grp(){
     $1 | grep $2 | less
}

并尝试运行其中任何一个:

grp 'pac -Q' nvidia
grp "pac -Q" nvidia
grp (pac -Q) nvidia

但我每个人都失败了,有什么建议吗?

TL;DR:基本上是标题或尝试command -XYZ以 $NUM 值或任何其他可用的相同方式接受

答案1

可能有一个解决方法。在 bash 中,当别名扩展以空格结尾时,下一个单词也会被考虑进行扩展。所以如果我有:

alias foo='echo ' bar=hello

然后foo bar将导致echo hello运行:

$ foo bar
hello

这样,您可以为grp函数使用别名,以使其第一个参数被考虑进行别名扩展,然后进行grp相应的修改以使用最后的参数作为模式:

grp () {
  local pat="${@: -1}"
  "${@:1:$#-1}" | grep "$pat" | less
}
alias grp='grp '

然后:

$ grp pac -Q nvidia
lib32-nvidia-utils 440.82-1
nvidia-dkms 440.82-2
nvidia-settings 440.82-1
nvidia-utils 440.82-2
opencl-nvidia 440.82-2

当然,这不适用于复杂的别名,例如使用管道的别名:

$ alias foo='bar | cat'
$ grp foo nvidia
cat: nvidia: No such file or directory

答案2

您可以尝试:

grp() {
    local grep_pattern=$1
    shift
    # remaining args are the command:
    "$@" | grep "$grep_pattern" | less
}

并像这样调用它:

grp nvidia pac -Q

答案3

编辑:我不傻。没关系。

我知道有点旧,但假设您不需要在各种旧的 shell 实现之间广泛移植,进程替换(而不是管道)是直接执行此操作的一种方法。

grp() {
  less -f <( grep ${@:2} <( $1 ))
}

根据要求调用 as grp 'pac -Q' nvidia

相关内容