명령 이름을 실행 파일로 찾는 과정
git status를 입력하면 셸은 디스크 전체를 뒤지지 않아. 콜론으로 나뉜 $PATH의 디렉터리를 왼쪽부터 보고, 처음 찾은 git을 실행해. zsh에서는 print -l $path로 목록을 보고 type -a git으로 같은 이름의 후보를 모두 확인할 수 있어.
순서가 모든 걸 결정해
/opt/homebrew/bin:/usr/bin:/bin이면 Homebrew 쪽 명령이 시스템 명령보다 먼저 잡혀. 순서를 바꾸면 같은 이름을 입력해도 다른 실행 파일이 선택될 수 있어. 경로를 고친 뒤에는 익숙한 이름만 믿지 말고 command -v와 버전을 함께 확인해.
which / type / command -v
셋은 묻는 범위가 달라.
which git: 외부 실행 파일을 찾는 별도 명령이라 셸의 별칭이나 함수는 놓칠 수 있어.type git: 현재 셸이 이름을 어떻게 해석하는지 보여 줘. 별칭, 함수, builtin, 외부 실행 파일을 구분해.command -v git: POSIX 셸 스크립트에서 명령 존재와 선택 결과를 확인할 때 쓰기 좋아.
zsh의 whence -a git도 모든 정의를 볼 때 유용해. 하나의 도구로 모든 질문에 답하려 하지 말고 알고 싶은 층에 맞춰 골라.
hash 캐시
셸은 이미 찾은 실행 파일의 경로를 캐시할 수 있어. 실행 파일을 교체했거나 경로 순서를 바꿨는데 예전 경로가 계속 선택되면 bash의 hash -r이나 zsh의 rehash로 캐시를 비워. 새 설치가 보이지 않는 원인을 무조건 캐시라고 단정하기 전에 경로와 실제 파일부터 확인해.
경로에 . 넣지 마
현재 디렉터리를 경로에 넣으면 그곳의 모든 이름이 명령 후보가 돼. 신뢰하지 않는 저장소에 같은 이름의 파일이 있으면 익숙한 명령을 가로챌 수 있어. 로컬 스크립트는 ./script.sh처럼 경로를 드러내고, 쓰기 가능한 공용 디렉터리와 빈 경로 항목도 피하자.