我试图总结 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
。