bash 시작 파일 실행 순서 완벽 정리
리눅스에서 bash 셸을 사용하다 보면 .bash_profile, .bashrc 같은 여러 설정 파일을 자주 접하게 됩니다. 그런데 이 파일들이 어떤 순서로 실행되는지 정확히 알고 있는 사용자는 많지 않습니다. 이 글에서는 다음 파일들이 셸 시작 및 종료 시점에 어떤 순서로 실행되는지 자세히 설명합니다.
- /etc/profile
- ~/.bash_profile
- ~/.bashrc
- ~/.bash_login
- ~/.profile
- ~/.bash_logout
로그인 셸(interactive login shell)의 실행 순서
로그인 셸이 시작될 때는 아래 의사 코드(pseudo code)와 같은 순서로 파일이 실행됩니다.
execute /etc/profile
IF ~/.bash_profile exists THEN
execute ~/.bash_profile
ELSE
IF ~/.bash_login exist THEN
execute ~/.bash_login
ELSE
IF ~/.profile exist THEN
execute ~/.profile
END IF
END IF
END IF
여기서 가장 중요한 포인트는 ~/.bash_profile, ~/.bash_login, ~/.profile 중 오직 하나만 실행된다는 점입니다. 세 파일 모두 존재하더라도 우선순위가 가장 높은 ~/.bash_profile 하나만 실행되고 나머지는 무시됩니다. 따라서 환경 설정을 여러 파일에 분산해 두면 일부 설정이 적용되지 않을 수 있으니 주의해야 합니다.
반면 로그인 셸에서 로그아웃할 때는 다음 순서로 실행됩니다.
IF ~/.bash_logout exists THEN
execute ~/.bash_logout
END IF
참고로 /etc/bashrc는 사용자가 직접 실행하는 것이 아니라 ~/.bashrc 내부에서 아래와 같이 호출됩니다.
# cat ~/.bashrc if [ -f /etc/bashrc ]; then . /etc/bashrc fi
비로그인 셸(interactive non-login shell)의 실행 순서
터미널에서 새 탭을 열거나 bash 명령으로 서브 셸을 실행하는 경우처럼 비로그인 대화형 셸이 시작될 때는 다음과 같이 ~/.bashrc만 실행됩니다.
IF ~/.bashrc exists THEN
execute ~/.bashrc
END IF
참고: 스크립트 실행처럼 비대화형(non-interactive) 셸이 시작될 때는 ENV 환경 변수를 확인하고, 해당 변수에 지정된 파일을 실행합니다.
실행 순서 직접 테스트하기
실행 순서를 눈으로 확인하는 가장 좋은 방법은 각 파일에 서로 다른 PS1 값을 넣어두고 재로그인한 뒤, 리눅스 프롬프트가 어떤 값으로 바뀌는지 관찰하는 것입니다. PS1을 활용하면 프롬프트를 기능적이면서도 멋지게 꾸밀 수 있습니다.
1. /etc/profile이 먼저 실행됩니다.
/etc/profile에 다음 PS1 라인을 추가한 뒤 재로그인하여, 프롬프트가 /etc/profile에 설정된 값으로 변경되는지 확인합니다.
# grep PS1 /etc/profile PS1="/etc/profile> " [재로그인하면 아래와 같이 프롬프트가 변경됩니다] Last login: Sat Sep 27 16:43:57 2008 from 192.168.1.2 /etc/profile>
이 테스트가 제대로 작동하려면 ~/.bash_profile에 PS1 설정이 없어야 합니다.
2. ~/.bash_profile이 실행됩니다.
이번에는 ~/.bash_profile, ~/.bash_login, ~/.profile, ~/.bashrc 네 파일 모두에 서로 다른 PS1을 넣어둡니다. 그리고 재로그인하면 프롬프트가 ~/.bash_profile의 PS1 값으로 변경되는 것을 확인할 수 있습니다.
/etc/profile> grep PS1 ~/.bash_profile export PS1="~/.bash_profile> " /etc/profile> grep PS1 ~/.bash_login export PS1="~/.bash_login> " /etc/profile> grep PS1 ~/.profile export PS1="~/.profile> " /etc/profile> grep PS1 ~/.bashrc export PS1="~/.bashrc> " [재로그인 시 /etc/profile이 먼저 실행되고, 다음으로 ~/.bash_profile이 실행됩니다. 따라서 아래와 같이 ~/.bash_profile의 PS1이 적용되며, ~/.bash_profile이 존재하기 때문에 ~/.bash_login은 실행되지 않습니다] Last login: Sat Sep 27 16:48:11 2008 from 192.168.1.2 ~/.bash_profile>
3. ~/.bash_login이 실행됩니다.
.bash_profile 파일의 이름을 다른 이름으로 변경한 뒤 재로그인합니다. ~/.bash_profile이 없어지자 이번에는 ~/.bash_login의 PS1 값이 프롬프트에 적용됩니다.
~/.bash_profile> mv .bash_profile bash_profile_not_used [재로그인 시 /etc/profile이 먼저 실행되고, ~/.bash_profile을 찾을 수 없으므로 ~/.bash_login이 실행됩니다] Last login: Sat Sep 27 16:50:55 2008 from 192.168.1.2 ~/bash_login>
4. ~/.profile이 실행됩니다.
마찬가지로 .bash_login의 이름도 다른 이름으로 변경하고 재로그인합니다. ~/.bash_profile과 ~/.bash_login이 모두 없으면 ~/.profile이 실행됩니다.
~/.bash_login> mv .bash_login bash_login_not_used [재로그인 시 /etc/profile이 먼저 실행되고, ~/.bash_profile과 ~/.bash_login을 찾을 수 없으므로 ~/.profile이 실행됩니다] Last login: Sat Sep 27 16:56:36 2008 from 192.168.1.2 ~/.profile>
5. 비로그인 셸 테스트 시 ~/.bashrc가 실행됩니다.
명령 프롬프트에서 "bash"를 입력하면 새로운 비로그인 셸이 시작되며, 이때 .bashrc가 호출됩니다.
~/.profile> bash [아래와 같이 .bashrc의 PS1이 적용됩니다] ~/.bashrc> exit exit [비로그인 셸을 종료하면 다시 원래의 로그인 셸로 돌아옵니다] ~/.profile>
정리: 핵심 실행 순서 한눈에 보기
- 로그인 셸: /etc/profile → ~/.bash_profile, ~/.bash_login, ~/.profile 중 존재하는 첫 번째 파일 하나만 실행
- 비로그인 셸: ~/.bashrc만 실행 (내부에서 /etc/bashrc 호출)
- 로그아웃 시: ~/.bash_logout 실행
이 순서를 이해하고 있으면 "분명히 설정했는데 왜 적용이 안 되지?"라는 흔한 문제를 빠르게 진단할 수 있습니다. 특히 ~/.bash_profile이 존재하면 ~/.profile이 무시된다는 점은 실무에서 자주 겪는 함정이니 꼭 기억해 두세요.