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
.
귀하의 명령은 options 을 전달할 때 발견된 모든 명령 이름의 경로를 /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
1 그러나 귀하의 것과 마찬가지로 /usr/bin/which
(zsh의 내장과 달리 ) 별칭, 함수, 내장 및 실행 가능 테이블 which
까지 무시하기 때문에 쉘이 실행할 명령을 반드시 알려주지는 않습니다 . $hash
당신은 또한 볼 수 있습니다" which "를 사용하지 않는 이유는 무엇입니까? 그러면 무엇을 사용해야 합니까?