모든 별칭을 grep하는 데 사용되는 ZSH 별칭이 작동을 멈췄습니다.

모든 별칭을 grep하는 데 사용되는 ZSH 별칭이 작동을 멈췄습니다.

이것은 약 8년 동안 저에게 효과적이었습니다.

$ alias al='alias | grep $1'

예:

$ al git
clean='git clean -xfde'
echo_git_root='echo "$(git rev-parse --show-toplevel || echo .)"'
# etc.

like를 호출하면 al git내 모든 git 별칭이 표시됩니다.

그러나 지금은 다음을 얻습니다.

$ al git
grep: git: No such file or directory

별칭이 대체되지 않은 것 같습니다.

$ alias al
al='alias | grep $1'

물론 (별명을 우회하여) naked 명령을 실행하면 정상적으로 작동합니다.

$ alias | grep git
clean='git clean -xfde'
echo_git_root='echo "$(git rev-parse --show-toplevel || echo .)"'
# etc.

나는 시도했다:

  • al='alias | /usr/bin/grep $1'
  • al='alias | \grep $1'
  • al='alias | grep ''$1'''
  • al='alias | grep \\'$1\\''

이 시점에서 나는 아이디어가 없습니다!

최근에 MacOS Monterey에서 Ventura로 업그레이드했습니다. 이전 ZSH 버전이 무엇인지는 잘 모르겠지만 현재는 5.9입니다. 이것이 관련이 있는지 확실하지 않지만 이것이 내 시스템에 대한 유일한 최근 변경 사항입니다.

답변1

별칭은 매개변수를 사용하지 않으며 단지 텍스트를 다른 텍스트로 대체합니다. 그것들은 매우 열악한 형태의 프로그래밍 구조입니다. 기능이없는 csh에서 왔습니다.

alias al='alias | grep $1'

명령 위치에서 토큰이 발견될 때마다 al토큰이 대체될 것이라고 말하면 다음과 같습니다.alias | grep $1

al git

다음으로 대체됩니다:

alias | grep $1 git

그러면 이는 쉘 코드로 해석됩니다.

비어 있거나 설정되지 않은 경우 $1다음과 같습니다.

alias | grep git

그러나 set foo baror 1=fooor 이후에 실행하면 argv[1]=foo다음과 같습니다.

alias | grep foo git

표준 입력을 무시하고 파일에서 찾습니다 grep.foogit

여기 Bourne 스타일이 필요합니다.

al() alias | grep "$@"

또는 csh 스타일²:

alias al='alias | grep'

1 csh별칭 소스에서 내역 확장과 관련된 몇 가지 트릭을 사용하여 별칭이 인수를 수용할 수 있는 것처럼 보이게 할 수 있지만 이러한 트릭은 Korn과 같은 셸에서는 작동하지 않습니다.

² 음 csh, 태그에 별칭을 추가하세요 . POSIX는 인터페이스를 지정 하고 복제하지만 에서는 제한 사항을 해결할 수도 있습니다 ( .alias al 'alias | grep'alias token replacementalias token=replacement=shzshzshaliases['=']=uname'='uname

관련 정보