Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

bash 시작 파일 실행 순서 완벽 정리: .bash_profile, .bashrc, .bash_login, .profile, .bash_logout

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이 무시된다는 점은 실무에서 자주 겪는 함정이니 꼭 기억해 두세요.