본문 바로가기
C.W.K.
Stream
Lesson 06 of 10 · published

경로: 셸이 실행 파일을 찾는 방식

~15 min · path, executable, type, which, whence

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

명령 이름을 실행 파일로 찾는 과정

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처럼 경로를 드러내고, 쓰기 가능한 공용 디렉터리와 빈 경로 항목도 피하자.

Code

지금 어떤 게 잡혔고 왜 잡혔는지·bash
echo $PATH | tr ':' '\n'
which python3
type python3
command -v python3
# zsh에서 같은 이름의 모든 정의 확인
whence -a python3
Apple Silicon에서 Homebrew 경로 우선 추가·bash
# 로그인할 때 실행되도록 ~/.zprofile에 추가
eval "$(/opt/homebrew/bin/brew shellenv)"
# .zshrc에서는 Homebrew 실행 파일이 먼저 잡힘
# 결과 확인
which brew && brew --prefix

External links

Exercise

echo $PATH | tr ':' '\n'으로 검색 순서를 확인하고 which python3type python3의 답을 비교해. jq를 설치한 뒤에도 명령이 잡히지 않는 상황을 만났다면 터미널을 다시 열기 전에 bash의 hash -r이나 zsh의 rehash로 경로 캐시를 갱신해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.