.bashrc 와 .profile, /etc/profile 차이

환경 설정 스크립트, 시작 파일들에 대하여

쉘 세션이 진행되는 동안 쉘은 환경 이라는걸 통해 정보들을 관리한다.

많은 프로그램들은 각자 가지고 있는 환경 설정 파일(.conf)을 참조하지만, 일부 프로그램들은 쉘에서 관리하는 환경을 찾아보기도 한다.

시스템에 로그인하면, 환경 설정 값들을 구성해주는 환경 설정 스크립트들을 읽는다.

사용자의 홈 디렉토리에 있는 .bashrc 파일과 .profile, /etc/profile 등 다양한 시작파일들이 존재한다.

이들은 조금씩 역할이 다르다.

~/.bashrc 와 ~/.profile, /etc/profile 은 어떻게 다를까?

쉘 세션은 크게 로그인 세션과 비로그인 세션으로 나뉘는데, 사용자계정과 비밀번호를 입력하여 들어가면 로그인 쉘 세션이라고 볼 수 있다.

로그인 쉘 세션

로그인 쉘 세션용 시작파일로 /etc/profile 과 홈디렉토리의 .profile 이 있다.

/etc/profile 은 사용자에 상관 없이, 누구든지 로그인을 했을 때 적용되는 시작 파일이고, 홈디렉토리의 .profile 은 해당 사용자가 로그인했을 때 읽는 시작파일이다.

따라서 /etc/profile -> ~/.profile 순서로 실행된다.

로그인하면서 /etc/profile 을 읽게 되면, /etc/profile/etc 에 존재하는 bash.bashrc 라는 파일을 읽고, profile.d 라는 디렉토리 아래에 있는 모든 쉘스크립트들을 실행시키는 것이다.

cat /etc/profile

# output
if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

/etc/profile 이 읽힌 다음에는 사용자 계정의 .profile 을 읽는데, 여기서는 .bashrc 를 읽기도 하고, 사용자의 실행파일이 담긴 디렉토리들을 환경변수에 추가한다.

cat ~/.profile

# output
if [ -n "$BASH_VERSION" ]; then
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc"
    fi
fi

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

비로그인 쉘 세션

비로그인 세션은, 일반적으로 로그인이 된 상태에서 GUI 환경에서 터미널을 실행할 때(Ctrl + Alt + T) 나타나는 쉘이다.

.bashrc 가 비로그인 쉘 세션의 시작파일이 되는데, .profile 에서도 .bashrc 를 실행시키는 걸 확인했었다. 비로그인용 쉘 세션의 시작파일이지만, 로그인 쉘 세션의 시작파일이 이를 참조하도록 만들어져 있는 것이다.

.bashrc 는 이렇듯 굉장히 많이 참조되는 파일이기 때문에 가장 많이 활용하는 중요한 파일이라고 생각하면 된다.

실제로도 자주 사용되는 alias 를 써넣거나, 실행파일을 참조하기 위해 디렉토리를 환경변수에 설정해주는 식으로 잘 사용하고 있다.

우분투에서는 bash 쉘을 쓰기 때문에 .bashrc 이고, 다른 쉘을 사용한다면 그에 맞게 파일명이 바뀔 수 있다.


이렇게 .bashrc 에서 사용자가 개인적으로 필요한 내용들을 설정해줌으로써, 쉘을 껐다 키더라도 시스템에서 명령어를 입력했을 때 해당 디렉토리를 찾아보게끔 할 수 있다.

alias vi=vim
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

터미널이 켜진 상태에서 .bashrc 를 수정했는데, 껐다 키고 싶지 않을 경우에는 아래 명령어를 통해 직접 .bashrc 를 적용시켜주면 된다.

source ~/.bashrc