
Bash에서는 which
경로가 순서대로 반환되는 것을 볼 수 있지만 zsh에서는 순서가 다릅니다.
which
저는 이제 주로 zsh를 사용합니다. zsh에서 적절한 출력 순서를 얻으려면 어떻게 해야 합니까 ? 왜 다른가요? 나는 그 순서가 내 길과 일치할 것이라고 기대했다.
내 경로는 다음과 같습니다/usr/local/bin:/usr/bin
bash$ which -a git
/usr/local/bin/git
/usr/bin/git
zsh$ which -a git
/usr/bin/git
/usr/local/bin/git -> ../Cellar/git/2.32.0/bin/git
답변1
당신은 다음과 같이 정의했습니다 which
.
which(){
/usr/bin/which -a "$@" |
xargs ls -l |
tr -s ' ' |
cut -d ' ' -f 9-
}
ls
출력 시 파일 이름을 어휘적으로 정렬하고 그 뒤에 옵니다 ./usr/local/bin/git
/usr/bin/git
l
뒤에 온다b
귀하의 지역에서.
GNU 구현에는 해당 정렬을 비활성화하는 옵션이 ls
있습니다 .-U
귀하의 명령은 옵션 을 전달할 때 /usr/bin/which
발견된 모든 명령 이름의 경로를 인쇄하는 명령인 것 같습니다 . 내장 기능을 사용하면 ¹ 에서도 동일한 작업을 수행할 수 있습니다 .$PATH
-a
zsh
whence -pa
따라서 다음과 같이 할 수 있습니다.
mywhich() (
set -o pipefail
zmodload zsh/stat
whence -pa "$@" |
while IFS= read -r f; do
if [[ -L $f ]] && stat -A l +link -- $f; then
print -r -- "$f -> $l"
else
print -r -- $f
fi
done
)
(여기에서는 파일 경로에 개행 문자가 포함되어 있지 않다고 가정합니다).
GNU 시스템에서 더 정확한 버전은 다음과 같습니다:
mywhich() (
set -o pipefail
command which -a "$@" |
xargs -rd '\n' ls -ndU -- |
sed -E 's/([^ ]+ +){8}//'
)
어쨌든 내장 기능이 bash
없으므로 출력되는 which
내용은 which
셸과 무관합니다. 오직 내장 tcsh
되어 zsh
있습니다 which
.
¹ 하지만 /usr/bin/which
zsh의 내장과 달리 which
별칭, 함수, 내장 및 심지어는 셸이 실행할 명령을 반드시 알려주지는 않습니다.$hash
별칭, 함수, 내장 및 실행 파일 테이블 . 또한보십시오" which "를 사용하지 않는 이유는 무엇입니까? 그러면 무엇을 사용해야 할까요?