태그 보관물: zsh

zsh

별칭 명령에서`which`를 사용하는 방법은 무엇입니까? 것입니다. $ which vim vim: aliased to

대부분의 사용자와 마찬가지로 자주 사용하는 프로그램에 기본 플래그 집합을 제공하도록 많은 별칭을 설정했습니다. 예를 들어

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

문제는 whichvim/ grep/ ls/ etc가 어디에서 왔는지 알기 위해 별칭을 사용한다는 것입니다.

$ which vim
vim: aliased to vim -X

이것은 유용한 출력이지만이 경우에는 내가 찾고있는 것이 아닙니다. 나는 알고 vim에 별명이 vim -X있지만 어디 있는지 알고 싶어 vim 에서오고있다.

내가 사용할 수 있도록 일시적으로 별칭을 정의하지 않으면 별칭 whichwhich‘포장 해제’하고 그 자체로 실행할 수있는 쉬운 방법 이 있습니까?

편집 :which 다른 셸에서 다른 동작을 가진 셸 내장형 인 것 같습니다 . Bash에서 SiegeX의 --skip-alias깃발 제안은 효과가 있습니다. 그러나 나는 Zsh에있다. 비슷한 것이 있습니까?



답변

which$SHELL쉘이 사용하는 시작 파일 (생각)을 기반으로 환경을 추측하기 때문에 실제로 이와 같은 작업을 수행하는 나쁜 방법입니다 . 때로는 잘못 추측 할뿐 아니라 일반적으로 다르게 행동하도록 말할 수 없습니다. ( 예를 들어 which내 우분투 10.10에서는 --skip-alias@SiegeX에서 언급 한 바와 같이 이해하지 못합니다 .) type구성 파일을 찌르는 대신 현재 셸 환경을 사용하고 해당 환경의 일부를 무시하도록 지시 할 수 있으므로 실제로 기본 쉘을 재구성 할 때 일어나는 일 대신에 발생합니다.

이 경우 type -P별명 또는 함수를 무시합니다.

$ type -P vim
/usr/bin/vim

한 번에 하나씩 모든 레이어 를 벗겨 내고 찾은 것을 보여줄 수도 있습니다.

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

(의견에서 이것을 확장하면 🙂

문제 which는 일반적으로 쉘 내장 대신 외부 프로그램이므로 별칭 또는 함수를 볼 수 없으며 쉘의 시작 / 구성 파일에서이를 재구성해야한다는 의미입니다. 쉘이 내장되어 zsh있지만 분명히 그렇지 않은 bash경우 쉘 환경을 사용하고 올바른 작업을 수행 할 가능성이 높습니다.

type그 것처럼 행동 요구되는 POSIX 호환 명령입니다 내장 (즉, 그것이 지역의 별칭과 기능을 포함에서 호출 것 쉘의 환경을 사용한다), 그래서 보통 이다 가 내장되어있다.

대부분의 최신 버전 에서는 쉘 내장이며 올바른 작업을 수행 하지만 일반적으로 csh/ tcsh에서는 찾을 수 없습니다 which. 때때로 내장은 what대신, 때때로에서 현재 쉘의 환경을 볼 수있는 좋은 방법이 없다 csh/ tcsh모든이.


답변

에서 bash:

type -P vim

에서 zsh:

type -p vim

둘다:

/usr/bin/which vim

또는:

( unalias vim; type vim )


답변

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


답변

이와 같이 정의 된 광산

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'


답변

다음을 시도하십시오 :

which --skip-alias vim


답변

또 다른 대안 command which vim모두에서 동일한 방식으로 작동, zshbash

예를 들어 내 Mac에서 :

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


답변

모두 typewhich쉘의 종류에 따라 다르게 작동합니다.

bash에서는 which에 존재하는 명령입니다 PATH. 에서 제공 한 명령을 검색합니다 PATH. Bash builtin type -P(P for PATH)은 정확히 같은 동작을합니다 which.

zsh을, 두 whichtype내장 매크로 및 내장의 일부 함수이다 whence. which -p당신이 원하는 것입니다. 경로 검색을 강제합니다. ( ZSH -P에서는 옵션을 사용할 수 없습니다 type.)

whence [-vcwfpamsS] [-x num] 이름 …

-피

별명, 예약어, 쉘 함수 또는 내장 인 경우에도 이름에 대한 경로 검색을 수행하십시오.

ZSH 매뉴얼에서 더 많은 것.

어느 [-wpamsS] [-x num] 이름 …

whence -c와 같습니다.

ZSH 에서 builtin which명령 을 건너 뛰고 사용하지 않으려면 :whichPATH

alias which="command which"