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

경로 관리

~10 min · path, homebrew, ordering

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

어느 명령이 실행될지는 $PATH가 정해

$PATH에는 실행 파일을 찾을 디렉터리가 콜론으로 구분되어 들어 있어. 셸은 목록을 왼쪽부터 차례로 확인하고, 요청한 이름과 같은 실행 파일을 처음 발견하면 그 파일을 실행해. Python이나 Node처럼 여러 버전을 설치했을 때 서로 엉키지 않게 하려면 이 탐색 순서를 관리해야 해.

뒤에 붙이면 기존 도구를, 앞에 넣으면 새 도구를 우선해

  • export PATH="$PATH:/new/dir"처럼 새 디렉터리를 뒤에 붙이면 기존 경로에서 같은 이름의 도구를 찾지 못했을 때만 새 도구가 선택돼.
  • export PATH="/new/dir:$PATH"처럼 앞에 넣으면 새 디렉터리의 도구가 먼저 선택돼. Homebrew, pyenv, mise가 설치한 도구를 우선할 때 흔히 쓰는 방식이야.

Apple Silicon에서는 Homebrew 환경을 한 번에 불러와

Apple Silicon용 Homebrew는 기본적으로 /opt/homebrew 아래에 설치돼. ~/.zprofile에 다음 줄을 넣으면 로그인 셸이 Homebrew 환경을 불러와.

eval "$(/opt/homebrew/bin/brew shellenv)"

이 명령은 PATH, MANPATH, INFOPATH와 Homebrew에 필요한 변수를 서로 맞는 값으로 한 번에 설정해. 새 Mac에서는 공식 설치 스크립트가 이 줄을 추가하도록 안내해 줘.

같은 경로가 거듭 들어가지 않게 해

시작 파일을 두 번 불러오면 같은 디렉터리가 $PATH에 반복해서 들어갈 수 있어. zsh에서 typeset -U path를 선언하면 path 배열에 같은 문자열이 추가될 때 중복을 자동으로 제거해 줘.

실제 탐색 순서를 눈으로 확인해

echo $PATH | tr ':' '\n'
echo $PATH | tr ':' '\n' | sort | uniq -d  # 중복 항목 확인
type python3       # 실제로 선택되는 명령 확인

프로젝트별 경로는 그 디렉터리 안에서만 바꿔

direnv는 프로젝트의 .envrc를 사용해서 해당 디렉터리에 들어갔을 때만 프로젝트 전용 bin을 경로 앞에 추가할 수 있어. mise 같은 도구와 함께 쓰면 프로젝트마다 필요한 도구 모음을 선택하면서도 전역 환경을 오염시키지 않을 수 있어.

$PATH는 문자열이 아니라 탐색 정책이야

목록 앞쪽의 디렉터리는 같은 이름을 가진 시스템 바이너리를 가릴 수 있고, 어떤 구현에서는 빈 항목을 현재 디렉터리로 해석하기도 해. 경로를 바꾼 뒤에는 command -v로 선택된 명령을 확인하고 type -a로 같은 이름의 다른 후보까지 살펴봐.

프로젝트 런타임은 한 계층만 소유하게 해

Conda, mise, pyenv, Homebrew가 동시에 경로를 바꾸면 활성화 순서에 따라 서로 다른 Python이 선택돼. 저장소와 서비스가 어느 관리자를 사용할지 명시하고, 다른 도구는 그 경계를 침범하지 않게 해야 실행 결과를 예측할 수 있어.

Code

권장 .zprofile 스니펫·zsh
# Apple Silicon용 Homebrew
eval "$(/opt/homebrew/bin/brew shellenv)"
# PATH와 FPATH의 중복을 자동 제거
typeset -U path fpath
# 사용자 전용 실행 파일 경로
path=("$HOME/.local/bin" "$HOME/bin" $path)

External links

Exercise

echo $PATH | tr ':' '\n'으로 경로를 한 줄씩 읽고 sort | uniq -d를 더해 중복을 찾아. zsh에서 typeset -U path를 적용하기 전후를 새 셸에서 비교하고, 중복을 만든 시작 파일도 함께 찾아.

Progress

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

댓글 0

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

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