설정 파일이 여러 개인 이유
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을 중복시킬 수 있어. 변경한 파일이 로그인, 대화형, 비대화형 가운데 어느 경우를 소유하는지 정한 뒤 그 종류의 완전히 새 세션에서 확인해.