포스트

/etc/profile, /etc/bashrc, ~/.bash_profile, ~/.bashrc

login/non-login과 interactive/non-interactive 축으로 본 .bash_profile·.bashrc·/etc/profile 로딩 순서, zsh 매핑까지.

/etc/profile, /etc/bashrc, ~/.bash_profile, ~/.bashrc

bash는 어떤 식으로 켜졌느냐에 따라 읽는 설정 파일이 다르다. PATH가 두 번 추가되거나 alias가 SSH에서만 안 먹는 등의 문제는 대부분 이 매트릭스를 모르는 데서 온다.

두 가지 축

의미예시
Login Shell로그인 절차를 거쳐 시작된 셸ssh user@host, 콘솔 로그인, bash -l
Non-Login Shell이미 로그인된 상태에서 추가로 띄운 셸터미널 새 탭, bash
Interactive키보드 입력을 받는 셸터미널
Non-Interactive스크립트 실행용bash script.sh

읽는 순서

Login Shell

  1. /etc/profile
  2. ~/.bash_profile → 없으면 ~/.bash_login → 없으면 ~/.profile (이 순서로 첫 번째 발견된 것만 읽음)

Non-Login + Interactive Shell

  1. /etc/bash.bashrc (배포판에 따라 /etc/bashrc)
  2. ~/.bashrc

Non-Interactive Shell

위 어느 것도 안 읽음. BASH_ENV 환경변수가 있으면 그것만.

흔한 컨벤션

~/.bash_profile에서 ~/.bashrc를 source하는 게 보통이다. 그래야 SSH(login)로 들어와도 평소 쓰는 alias/함수가 적용된다.

1
2
# ~/.bash_profile
[ -f ~/.bashrc ] && source ~/.bashrc
파일용도
/etc/profile시스템 전역 환경변수, 라이센스 위치 등
~/.bash_profile개인 환경변수, PATH, login 1회용 초기화
/etc/bashrc시스템 전역 alias, 프롬프트
~/.bashrc개인 alias, 함수, 프롬프트

zsh와의 매핑

bashzsh
~/.bash_profile~/.zprofile (login)
~/.bashrc~/.zshrc (interactive)
~/.zshenv (모든 zsh 호출 시)

macOS의 Terminal.app은 기본으로 login shell을 띄우기 때문에 .bash_profile/.zprofile이 우선이고, Linux의 GNOME Terminal은 보통 non-login이라 .bashrc/.zshrc가 우선이다. 환경 차이의 흔한 원인.

점검 방법

1
2
shopt login_shell        # bash: on이면 login
echo $0                  # -bash면 login, bash면 non-login

PATH가 중복되는 것 같으면 어떤 파일에서 추가되는지 set -x를 맨 위에 잠깐 두고 추적한다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.