別のエイリアス+パラメータでエイリアスを呼び出す

別のエイリアス+パラメータでエイリアスを呼び出す

引数を使用して他のコマンドを提供できると同時にgrepを要約しようとしていますが、それを機能させる方法がわかりません。私がしている作業は次のとおりです。

alias pac='sudo pacman'

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

次のいずれかを実行してみてください。

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

しかし、私はすべてに失敗しました。どんな提案がありますか?

重要な要約:基本的にヘッダーを使用するか、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

修正:私は愚かではありません。それは問題ではありません。

少し古いことを知っていますが、以前のさまざまなシェル実装間で広範な移植性が必要ないと仮定すると、プロセスの置き換え(パイプの代わりに)がそれを直接実行する1つの方法です。

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

リクエストに応じて電話してくださいgrp 'pac -Q' nvidia

関連情報