별칭 명령에 "which"를 사용하는 방법은 무엇입니까?

별칭 명령에 "which"를 사용하는 방법은 무엇입니까?

대부분의 사용자와 마찬가지로 저는 일반적으로 사용되는 프로그램에 대한 기본 플래그 세트를 제공하기 위해 여러 개의 별칭을 설정했습니다. 예를 들어,

alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'

문제는 내 / / 등이 어디에서 왔는지 which확인하기 위해 이를 사용하려는 경우 별칭이 방해가 된다는 것입니다 .vimgrepls

$ which vim
vim: aliased to vim -X

이는 유용한 출력이지만 이 경우 내가 찾고 있는 출력은 아닙니다. vim별칭이라는 것은 알지만 vim -X어디에 있는지 알고 싶습니다.저것 vim출신이다.

사용할 수 있도록 일시적으로 별칭 정의를 해제하는 것 외에 별칭을 "잠금 해제"하고 실행할 수 있는 which쉬운 방법이 있습니까 ?which

편집하다:이것은 which다른 쉘에서 다르게 동작하는 쉘 내장 함수인 것으로 보입니다. Bash에서는 SiegeX의 --skip-alias플래그 제안이 작동하지만 저는 Zsh를 사용하고 있습니다. 비슷한 것이 거기에도 존재합니까?

답변1

which$SHELL이는 실제로 이와 같은 작업을 수행하는 나쁜 방법입니다. 왜냐하면 쉘이 사용하는 시작 파일(생각하는)을 기반으로 환경을 추측하기 때문입니다. 때로는 잘못 추측할 뿐만 아니라 다르게 작동하도록 지시할 방법도 없는 경우가 많습니다. (예를 들어 whichUbuntu 10.10에서는 @SiegeX가 언급한 내용을 이해하지 못합니다.) 구성 파일을 보는 대신 현재 셸 환경을 사용하고 해당 환경의 일부를 무시하라는 메시지를 받을 수 있으므로 실제로 무슨 일이 일어나는지 보여줍니다. 무슨 일이 일어나는지, 기본 쉘이 재구축될 때 일어나는 일이 아닙니다.--skip-aliastype

이 경우 type -P별칭이나 함수는 무시됩니다.

$ type -P vim
/usr/bin/vim

벗겨달라고 하셔도 됩니다모두한 번에 한 레이어씩 검색하여 무엇을 찾을 수 있는지 보여줍니다.

$ type -a vim
vim is aliased to `vim -X'
vim is /usr/bin/vim

(댓글을 기반으로 이에 대한 확장 :)

문제는 which이것이 일반적으로 셸에 내장된 것이 아니라 외부 프로그램이라는 것입니다. 즉, 별칭이나 기능을 볼 수 없으며 셸의 시작/구성 파일에서 다시 생성해야 한다는 의미입니다. (만약 쉘 내장형이라면, zshbash환경을 사용하고 올바른 일을 할 가능성이 더 높을 것입니다.)

type내장 명령처럼 실행해야 하는 POSIX 호환 명령입니다(즉, 로컬 별칭 및 함수를 포함하여 이를 호출하는 셸의 환경을 사용해야 합니다).내장된 것.

csh일반적으로 / 에서는 발견 되지 않습니다 tcsh. 비록 대부분의 최신 버전에서는 which쉘 내장이고 올바른 일을 수행하지만 때로는 내장 이고 때로는 현재 쉘의 환경을 전혀 what볼 수 있는 좋은 방법이 없습니다 .cshtcsh

답변2

존재하다 bash:

type -P vim

존재하다 zsh:

type -p vim

동시에:

/usr/bin/which vim

또는:

( unalias vim; type vim )

답변3

zsh에서는 which다음과 같은 내장 명령이 있습니다:

$ whence -w which
which: builtin

실행하다외부 명령(모든 쉘에서) which, 사용전체 경로:

$ /bin/which ls; echo $?
/bin/ls
0

따라서 명령이 발견되고 ls(종료 값 0으로) 위치가 지정됩니다 /bin/ls.

내부 zsh; 검색 방법(위의 방법에 추가)외부 명령예:

$ whence -p ls
/bin/ls

그러나 다음과 같은 중첩된 별칭은 해결되지 않습니다.

$ alias dire='ls -l'

dire이 명령은 명령을 찾을 수 없음 을 보고합니다 .

$ whence -p dire; echo $?
1

중첩된 별칭을 수동으로 해결하려면 다음을 참조하세요.Resolve nested aliases to their source commands

답변4

또 다른 옵션은 다음과 command which vim같은 방식으로 작동한다는 것입니다.zshbash

예를 들어 내 Mac에서는 다음과 같습니다.

LOLcalhost :: ~ % command which grep
/usr/local/bin/grep

관련 정보