인수를 사용하여 다른 명령을 제공할 수 있는 동시에 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
수정: 저는 바보가 아닙니다. 그것은 중요하지 않습니다.
조금 오래되었다는 것을 알고 있지만 다양한 이전 쉘 구현 간에 광범위한 이식성이 필요하지 않다고 가정하면 프로세스 대체(파이프 대신)가 이를 직접 수행하는 한 가지 방법입니다.
grp() {
less -f <( grep ${@:2} <( $1 ))
}
요청 시 전화하세요 grp 'pac -Q' nvidia
.