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


76

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

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에있다. 비슷한 것이 있습니까?


zsh을에, 경우에 당신이 알고 싶은 그 곳 vim에서오고 , 당신은 사용하십시오where vim
마티 Nalis

답변:


105

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모든이.


6
감사! 이것은 내 트릭 가방에 추가하는 데 매우 유용합니다. 나는 특히 첫 번째 인스턴스 뿐만 아니라의 모든 인스턴스 type -a를 반환 하는 것 같습니다 . 나는 별명 을 줄 것입니다 :)$PATHwhichtype
Adrian Petrescu

2
@ geekosaur : 감사합니다. typePOSIX 표준의 일부 라면 그 길을 갈 것입니다. 내 질문에 대답하려면 zsh에서도 작동합니다 (Debian). 배포판이 제거되지 않는 이유 whatwhich표준화되지 않았고 추가 기능이없는 이유는 무엇입니까?
Faheem Mitha

1
아니, 원격조차도.
geekosaur

1
@Faheem : 문서를 다시 작성하면 info bash 'Bash builtins'Linux에서 시작 하지만 zsh참조 설명서 에서 얻을 수 있습니다. 더 공식적으로는 pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (실제로 spec -P또는 -a, 또는 -p원래 형식은 -P아니지만 현재 쉘 환경을 사용해야 함).
geekosaur

2
type -pzsh와 bash간에 다르게 작동합니다. type -Pzsh에는 전혀 존재하지 않습니다.
kojiro

15

에서 bash:

type -P vim

에서 zsh:

type -p vim

둘다:

/usr/bin/which vim

또는:

( unalias vim; type vim )

2
마지막은 멋지다. 이를 위해 별칭을 가질 수 있습니다. :)
balki

redhat의 bash에서 유형 -P를 사용해야하며 정답을 원한다면 어느 것도 아닙니다. 별명이나 기능은 없습니다.

에발 박사, "어떤"? 어느 Red Hat?
Mikel

@ 미켈 RH7.4. GNU 어느 v2.20.

4

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


2

이와 같이 정의 된 광산

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

1

다음을 시도하십시오 :

which --skip-alias vim

1
흥미 롭습니다! 이것은 Bash에서는 작동하지만 Zsh에서는 작동하지 않습니다 (실제로 이것이 쉘 종속적이라고 생각하지 않았습니다). 이것은 which필자가 생각했던 것처럼 일반적인 유닉스 유틸리티가 아니라 실제로 쉘 내장 이라는 것을 깨달았 습니다. 그래서 질문을 편집하고 Zsh를 지정해야합니다. 이것을 지적 해 주셔서 감사합니다!
Adrian Petrescu

which최소한 데비안에는 내장되어 있지 않습니다. 쉘 스크립트이며 debianutils의 일부이므로 zsh에서 작동합니다. 그러나 데비안 --skip-alias에서는 옵션이 아닙니다 which. which떠 다니는 다른 종류가 있습니까? 이것은 표준화 된 명령 인 것으로 보이지는 않습니다.
Faheem Mitha

@Faheem Mitha : zsh 내장입니다. 참조하십시오 man zshbuiltins. 어느 [-wpams] name ... whence -c와 동일합니다.
Mikel

예, Xubuntu의 bash경우 내장 기능이 아니며 --skip-alias옵션 이 없습니다 .
polym

CentOS (및 RHEL?) 6에서는 실행 파일 /usr/bin/which과 별명으로 별명을 /etc/profile.d처리 할 수 ​​있지만 --skip-alias작동합니다. 결과적으로 which which별명이 command which which표시 되지만 실행 파일이 표시됩니다!
dave_thompson_085

0

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

예를 들어 내 Mac에서 :

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

아 공정한.
Zee Alexander

0

모두 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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.