C.W.K.
Stream
Lesson 06 of 10 · published

PATH — Shell 이 실행 파일을 찾는 방식

~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

모든 command 마다 도는 lookup

git status 라고 치면 shell 은 디스크 전체를 뒤지지 않아. $PATH — 콜론으로 구분된 디렉터리 목록 — 을 왼쪽부터 오른쪽으로 걸으면서 처음 만난 git 을 실행해. echo $PATH 가 목록을 보여주고, which git 이 어떤 게 뽑혔는지 알려줘.

순서가 모든 걸 결정해

순서가 진짜 핵심이야. /opt/homebrew/bin:/usr/bin:/bin 이면 Homebrew 가 시스템보다 우선. 만약 /usr/bin 이 먼저 오면 Homebrew 로 깐 python3 가 있어도 시스템 거가 잡혀. 해결은 .zprofileexport PATH="/opt/homebrew/bin:$PATH" 로 prepend.

which / type / command -v

도구 셋, 답 셋:

  • which git — external binary 만 봄. alias / function 놓침.
  • type git — shell 이 알아. alias / function / builtin / external 인지 알려줘.
  • command -v git — POSIX, 스크립트용. 경로 반환하거나 non-zero exit. 스크립트에선 이거 써.

zsh 에는 whence -a git 가 있어 — 모든 정의를 다 보여줘. 하나가 다른 하나를 가릴 때 유용해.

hash 캐시

shell 은 한 번 실행한 command 의 경로를 캐시에 저장해서 매번 $PATH 안 걸어. 그래서 새로 brew install 한 직후에 'command not found' 가 뜰 수 있어 — hash -r (bash) 또는 rehash (zsh) 로 캐시 flush 하면 새로 잡혀.

PATH 에 . 넣지 마

현재 디렉터리 (.) 를 $PATH 에 넣으면 편한 것 같지만 보안 footgun 이야. 누가 네가 cd 할 디렉터리에 파일을 뿌려두면 어떤 command 든 hijack 가능. 로컬 스크립트는 항상 ./script.sh 로 명시 실행.

Code

지금 어떤 게 잡혔고 왜 잡혔는지·bash
echo $PATH | tr ':' '\n'
which python3
type python3
command -v python3
# zsh only — show every definition shadow
whence -a python3
Apple Silicon 에서 Homebrew prepend·bash
# Add to ~/.zprofile so it runs at login
eval "$(/opt/homebrew/bin/brew shellenv)"
# Then in .zshrc you can rely on brew binaries first
# Verify
which brew && brew --prefix

External links

Exercise

echo $PATH | tr ':' '\n' 로 순서 확인. which python3type python3 비교. brew install jqjq --version 안 잡히면 hash -r (터미널 재시작 말고) — 그게 캐시야.

Progress

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

댓글 0

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

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