다른 별칭 + 매개변수로 별칭 호출

다른 별칭 + 매개변수로 별칭 호출

인수를 사용하여 다른 명령을 제공할 수 있는 동시에 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.

관련 정보