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

셸 설정 파일

~13 min · zshrc, zprofile, zshenv, bashrc

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

설정 파일이 여러 개인 이유

zsh는 시작 방식에 따라 서로 다른 설정 파일을 읽어. 모든 셸에 필요한 값, 로그인할 때 한 번 정할 값, 프롬프트에서만 필요한 기능의 수명이 다르기 때문이야. 책임이 맞지 않는 파일에 넣으면 느린 시작이나 ‘환경 변수가 안 보인다’는 버그가 생겨.

zsh의 네 설정 파일

  • ~/.zshenv: 비대화형 호출을 포함한 모든 zsh가 읽어. 빠르고 조용하게 유지해.
  • ~/.zprofile: 로그인 셸이 읽어. Homebrew shellenv처럼 로그인 환경에 필요한 설정을 둬.
  • ~/.zshrc: 대화형 셸이 읽어. 별칭, 프롬프트, 플러그인, 자동 완성을 둬.
  • ~/.zlogin: 로그인 셸에서 zshrc 뒤에 읽지만 자주 쓰지는 않아.

bash에서 대응하는 파일

  • ~/.bash_profile: 로그인 bash가 읽어.
  • ~/.bashrc: 대화형 비로그인 bash가 읽어.
[[ -f ~/.bashrc ]] && source ~/.bashrc

한 파일에서 다른 파일을 불러 공통 설정을 모을 수 있지만, 어떤 시작 경로가 실행했는지는 구분할 수 있어야 해.

로그인 셸과 대화형 셸

로그인 셸은 세션을 시작하는 셸이고, 대화형 셸은 사람이 프롬프트에 입력하는 셸이야. 한 셸이 둘 다일 수도 있고 하나만 해당할 수도 있어. SSH 명령은 호출 방식에 따라 다른 셸 모양을 만들 수 있고, cron과 launchd는 zsh 시작 파일을 대신 읽어 주지 않아.

어떤 설정을 어디에 둘까?

  • 로그인 zsh에 필요한 경로와 로케일은 ~/.zprofile에 둬.
  • 별칭, 함수, 프롬프트는 ~/.zshrc에 둬.
  • 모든 zsh 호출에 꼭 필요한 최소 값만 ~/.zshenv에 둬.

launchd와 cron이 로그인 셸 파일을 자동으로 읽는다고 가정하지 말고 각 실행 주체가 환경을 어디서 받는지 따로 확인해.

편집한 설정 다시 읽기

source ~/.zshrc는 현재 셸 위에 설정을 다시 적용하고, exec zsh는 현재 프로세스를 새 zsh로 교체해. 후자가 상태 중복은 줄이지만 원래 로그인 문맥까지 다시 만들지는 않아.

실행 횟수와 부작용을 함께 봐

~/.zshenv에 출력이나 느린 명령을 넣으면 비대화형 스크립트까지 영향을 받아. 프롬프트 초기화는 zshrc로 좁히고, 공통 파일은 출력 없이 빠르게 끝나게 해.

source와 새 세션은 같은 검증이 아니야

source ~/.zshrc는 PATH 항목이나 hook을 중복시킬 수 있어. 변경한 파일이 로그인, 대화형, 비대화형 가운데 어느 경우를 소유하는지 정한 뒤 그 종류의 완전히 새 세션에서 확인해.

Code

로드 순서 확인·bash
# 각 파일이 읽히는 시점을 출력
echo 'echo ".zshenv loaded"'   >> ~/.zshenv
echo 'echo ".zprofile loaded"' >> ~/.zprofile
echo 'echo ".zshrc loaded"'    >> ~/.zshrc
# 새 터미널에서 읽히는 순서 확인
# 확인한 뒤 진단용 출력 줄 제거
터미널 안 닫고 다시 불러오기·bash
exec zsh           # 가장 깔끔한 재시작
source ~/.zshrc    # 대화형 설정만 다시 읽을 때 사용
# PATH나 .zprofile을 바꿨다면 exec zsh 사용

External links

Exercise

각 zsh 시작 파일에 임시 표시를 하나씩 넣고 새 터미널 세션과 명시적인 zsh -c에서 어느 파일이 읽히는지 비교해. bash의 동작은 별도 실험으로 분리하고, 끝나면 표시를 모두 제거해. 예약 작업은 같은 결과라고 추측하지 말고 실제 실행 설정을 확인해.

Progress

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

댓글 0

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

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