引数を使用して他のコマンドを提供できると同時に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
。