profile과 bashrc
profile과 bashrc에 대해서 알기 위해서는 먼저 로그인 셸 (Login shell)과 비로그인 셸 (Non-login shell)에 대해서 알아야 한다.
로그인 셸 (Login shell)이란?
로그인 셸은 시스템에 처음 로그인할 때 열리는 셸을 말하며, 사용자 환경을 설정하는 역할을 한다. 터미널을 열어 직접 로그인을 하거나, SSH로 원격 접속할 때 실행되는 셸이 이에 해당한다.
/etc/profile → ~/.bash_profile → ~/.bashrc → /etc/bashrc 순으로 파일들을 읽으며 환경을 설정한다.
비로그인 셸 (Non-login shell)이란?
비로그인 셸은 로그인 절차를 거치지 않고 열리는 셸이다. 예를 들어, 터미널을 새로 열거나 스크립트를 실행할 때 사용하는 셸이 이에 해당하며, 로그인 절차 없이 바로 셸을 실행하는 경우를 의미한다.
~/.bashrc → /etc/bashrc 순으로 파일들을 읽는다.
여기서 비로그인 셸이 profile을 읽지 않는 이유는, 비로그인 셸은 로그인 절차를 거치지 않고 이미 설정된 환경을 바탕으로 빠르게 셸을 실행하기 위해 사용되기 때문이다. 따라서 비로그인 셸은 이미 한 번 설정된 환경을 그대로 사용하므로, 별도의 환경 변수를 재설정할 필요가 없다.
그럼 이제 profile과 bashrc에 대해 알아보자
profile
시스템에 영향을 미치는 환경 변수나 경로를 설정하는 파일이며, /etc 경로와 ~/ 경로에 위치한다.
CentOS 7 기준으로 /etc에는 profile라는 이름으로, ~/ 경로에는 .bash_profile 이라는 이름으로 존재한다
# /etc/profile
# JAVA 환경 변수 설정
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH
bashrc
시스템에서 사용되는 별칭(alias)이나 함수를 설정하는 파일이며, /etc 경로와 ~/ 경로에 위치한다.
/etc에는 bashrc 라는 이름으로, ~/ 경로에는 .bashrc 이라는 이름으로 존재한다
# etc/bashrc
# 별칭 정의
alias ll='ls -alF'
alias vi='vim'
# 사용자 정의 함수
function my_greet() {
echo "Hello, $USER! Welcome to your terminal."
}
그렇다면 동일한 목적을 가진 파일들이 왜 /etc 경로와 ~/ 에 두 개의 경로에 존재하는 것일까?
이는 적용 범위의 차이이다. /etc 경로에는 시스템 전역에 미치는 파일들이 모여있는 곳이다. 때문에, /etc 경로에 있는 profile과 bashrc는 어떤 사용자가 로그인해도 적용이 되는 설정파일이고, ~/ 에 있는 .bash_profile와 .bashrc 파일들은 특정 계정 에만 영향을 미치는 설정파일인 것이다.
정리하자면, 환경 변수나 경로를 설정하기 위해서는 profile 파일을 사용해야 하고, 시스템에서 사용되는 별칭(alias)이나 함수를 설정하고자 할 때에는 bashrc 파일에 설정해야 한다.
다만, /etc 경로에 있는 파일을 수정할 경우, 시스템 전체에 영향을 미치기 때문에 수정의 부담이 크고, 실수로 인한 문제를 피하기 어려울 수 있다. 따라서, 개인 사용자의 설정을 변경하고 싶다면 ~/.bash_profile이나 ~/.bashrc 파일을 수정하는 것을 지향하는 것이 좋다.
참고
리눅스 etc/profile, etc/bashrc, ~/.bash_profile, ~/.bashrc 차이 제대로 이해하기 (tistory.com)
Login vs Non-Login Shell (/etc/profile, .bash_profile, .bashrc) (tistory.com)