.bashrc 와 .profile 차이와 작동원리

2022. 1. 30. 13:13[개발] 지식/리눅스

Login Shell 과 Non-login Shell

먼저 Login ShellNon-login Shell을 구분해서 알 필요가 있다. Login Shell이란 계정과 암호를 입력해서 Shell을 실행하는 것이다. ssh로 로그인하거나, GUI에서 로그인하는 경우 여기에 해당된다. 반면 Non-login Shell은 로그인 없이 실행되는 Shell을 말한다. ssh로 접속하고 나서 bash를 다시 실행하는 경우, GUI에서 터미널을 새로 띄우는 경우, sudo su 같이 계정을 변경하는 경우 등이 해당된다.

Login ShellNon-login Shell 이 열릴 때 환경변수를 초기 세팅하기 위한 파일들이 로드된다. 이때 계정에 상관없이 전역적으로 로드되는 파일들이 있고, 계정별로 로드되는 별도의 파일들이 있다. 전역적으로 로드되는 파일들은 /etc/profile 과 /etc/bashrc 가 있고, 계정별로 로드되는 파일은 .bash_profile 또는 .profile 과 .bashrc 가 있다.

파일 로드 순서

시스템에 로그인하면 아래와 같은 순서로 파일을 읽는다.

  1. /etc/profile
  2. ~/.bash_profile or ~/.profile
  3. ~/.bashrc
  4. /etc/bashrc

수행 작업

각 단계에서의 자세한 수행 작업은 아래와 같다.

  1. /etc/profile에서는 /etc/profile.d 디렉터리 안에 존재하는 모든 쉘 스크립트를 실행시킨다. /etc/profile.d에는 vim, qt, lang, colorls 등 다양한 설정이 sh 파일 형태로 존재한다. 쉘에 로그인하면 일단 이 sh파일들을 모두 실행시키는 것이다.
  2. 그 다음 계정 디렉터리에 있는 .bash_profile 또는 .profile 을 로드한다. 이 파일들은 계정에 종속적이기 때문에 계정 디렉터리에 존재하므로 ~/.bash_profile 또는 ~/.profile 파일을 로드하게 되는 것이다. PATH 같은 환경변수를 설정할 때 이 파일들을 수정하는 이유가 여기에 있다.
  3. 이제 계정 디렉터리에 있는 .bashrc 파일을 로드한다. 이 파일은 로그인과 상관없이 bash 콘솔을 새롭게 열 때 실행된다. 파일 안에는 아래와 같은 구문이 있는데, /etc/bashrc 파일을 실행하라는 뜻이다.
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi
  1. 마지막으로 /etc/bashrc 파일을 실행한다. 이 파일도 /etc/profile과 마찬가지로 계정과 상관없이 전역적으로 영향을 미친다.

/etc/profile 과 /etc/bashrc

먼저 /etc 디렉터리로 가면 profile과 bashrc 파일이 있다. 이 파일들은 계정과 상관 없이 전역적으로 영향을 미치게 된다.

~/.profile 과 ~/.bashrc

계정 디렉터리로 가면 .bashrc.bash_profile or .profile이라는 2개이 파일이 있다.여기서 .bash_profile이란 bash로 로그인 할 때만 로드된다. 반면 .profile은 bash와 상관없이 로그인 하면 로드된다. 두 개 중 하나만 로드되며 bash로 로그인하면 .bash_profile만, bash 외 쉘로 로그인하면 .profile만 로드된다. 이 파일들은 공통적으로 환경변수를 세팅할 때 사용하고, 차이점은 실행되는 시점이 다르다는 것이다.

  • .profile : 로그인 되는 시점에 실행 (Login Shell). bash와 상관 없는 것들을 넣는다.
  • .bash_profile : Bash로 로그인 되는 시점에 실행 (Login Shell).
  • .bashrc : 새로운 콘솔을 열 때 실행 (Non-login Shell). 로그인 없이 Bash가 실행될 때 로드된다. bash 쉘이 아닌 경우 각 쉘에 맞는 cshrc, tcshrc, kshrc 파일 등이 동일한 역할을 한다.

환경변수 설정

전역 파일 설정

/etc/profile 을 열어보면 아래와 같은 주석이 있다.

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

/etc/bashrc 를 열어보면 아래와 같은 주석이 있다.

# System wide functions and aliases
# Environment stuff goes in /etc/profile

즉 리눅스가 권장하는 사용 방식이란, 환경설정은 profile에, 기타 함수나 alias 설정은 bashrc에 하라는 것이다.

사용자 계정 파일 설정

사용자 디렉터리에 있는 .bash_profile 또는 .profile.bashrc 가 위의 전역 파일들에 대응된다고 볼 수 있다. 다만 로드 순서는 전역 파일이 먼저고 사용자 파일이 그 다음이다. 두 파일에서 중복되지 않는 내용들은 둘 다 적용된다고 볼 수 있다. 하지만 만약 내용이 중복된다면 사용자 계정 파일의 내용이 우선된다.

수정이 필요할 때

웬만하면 사용자 계정 파일에 환경변수나 alias 세팅을 하는 것이 좋다고 생각된다. 프로그래밍과 마찬가지로 전역 설정을 건드리는 것은 예측 불가능한 작동을 야기할 수 있기 때문에 언제나 조심해야 한다. 따라서 필요시에는 가급적 사용자 계정 디렉터리에 있는 환경설정 파일을 수정하고, 전역 설정을 변경해야 하는 경우에도 직접 전역 파일을 건드리지 말고 사용자 계정의 환경설정 파일 내에서 연속성을 유지할 수 있도록 수정해야 한다. 예를 들면 /etc/profile에 아래와 같이 정의되어 있고:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

PATH를 수정해야 하는 상황에 놓였을 때, /etc/profile 를 직접 수정하는 것이 아니라 ~/.profile을 아래와 같이 전역 설정을 기반으로 연속적으로 수정한다.

PATH="$PATH:/usr/home/test"

Reference

.bashrc 와 .bash_profile의 차이점

.profile, .bashrc 차이 및 실행순서

/etc/profile, ~/.bash_profile, ~/.bashrc, /etc/bashrc 파일 비교

etc/profile, .profile, /etc/bashrc .bashrc

Bash 설정

<