리눅스 etc/profile, etc/bashrc, ~/.bash_profile, ~/.bashrc 차이 제대로 이해하기

리눅스 환경변수를 설정하는 방법을 찾기 위해 구글링을 해보면 etc/profile, etc/bashrc, ~/.bash_profile, ~/.bashrc 파일들을 마주합니다. 하나만 콕 집어주면 안 헷갈리겠는데, 대체 뭘 바꾸라는 건지 이해가 잘 되지 않으실 수 있습니다. 결론부터 말하면 환경변수 설정은 ~/.bash_profile에 하면 됩니다. 그 이유와 각 파일별 차이는 차근차근 설명드리겠습니다.

리눅스 환경변수 설정

리눅스 환경변수 설정을 포함해 함수, 별칭 지정 등을 세팅하기 위해서는 profile, bashrc, .bash_profile, .bashrc 등을 수정해야 합니다. 이 개념을 이해하기 위해서는 먼저 쉘이 무엇인지 알 필요가 있습니다.

쉘(Shell)이란?

유닉스/리눅스 시스템에서 사용자는 프로그램을 통해 시스템을 조작합니다. 그 프로그램이 바로 쉘입니다. 예를 들어, 사용자가 명령줄 인터페이스로 pwd를 입력하면 현재 경로를 보여주고, cd ..를 입력하면 이전 디렉토리로 이동합니다. 이렇게 사용자의 명령을 운영체제가 이해할 수 있게 전달하고, 그에 맞는 결과를 만들어주는 프로그램이 쉘입니다. 즉, 리눅스를 쓴다는 건 쉘을 쓴다는 의미입니다.

 

쉘도 종류가 있습니다. bash, sh, tcsh, csh 등이 그 예입니다. 일단 그냥 bash만 기억하시면 됩니다. 대부분의 리눅스 배포판에서 기본 쉘로 bash를 사용하고 있기 때문입니다. 이 포스팅 역시 bash 쉘 사용을 기준으로 작성합니다.

 

현재 사용하고 있는 쉘을 확인하려면 echo $0 명령어를 수행하고 결과를 보면 됩니다. -bash가 출력되면 bash를 쓰고 있는 것입니다.

[root@localhost ~]# echo $0
-bash

로그인 쉘과 비로그인 쉘의 차이

아이디와 패스워드를 입력해서 쉘을 실행하면 “로그인 쉘”이라고 부릅니다. PuTTY 같은 툴을 통해 SSH로 접속하는 게 이에 해당합니다. 로그인과 함께 bash가 실행되면 ~/.bash_profile 파일이 자동으로 실행되며 그 안에 기록된 설정값을 세팅합니다.

 

비로그인 쉘(Non-Login Shell)은 로그인 없이 실행하는 쉘을 의미합니다. 예를 들어, SSH로 접속하고 다시 bash를 실행하거나, GUI 세션에서 터미널을 띄우는 것, sudo나 su 등 명령어를 통해 계정을 대신해 명령을 내리거나 계정을 변경하는 경우 등이 그렇습니다. 

/etc와 ~/의 차이

/etc 경로에는 시스템 전역에 영향을 미치는 파일들이 모여 있습니다. 즉 /etc에 있는 profile과 bashrc 역시 전역적으로 영향을 미치는 파일입니다. 이 파일은 가능한 건드리지 않는 게 좋습니다. 실제로 /etc/profile 파일을 열면 주석에 이렇게 나와 있습니다.

당신이 뭘 하고 있는지 모른다면, 이 파일을 수정하는 건 좋은 생각이 아니다.

저도 /etc/profile에 변수를 잘못 설정했다가 기본으로 설정된 필수 명령어들을 사용 못하게 된 경험이 있습니다. 그땐 FTP 없이는 다시 수정도 못합니다. cd, ls, vi 아무것도 안되니까요.

 

반면 ~/는 지역적인 사용자 계정 디렉토리입니다. 특정 계정에만 영향을 미치기 때문에 수정에 부담이 적습니다. 그러니 환경변수 설정은 ~/에서 한다고 생각하시면 됩니다.

 

그래도 /etc 경로 파일부터 차례로 설명드리겠습니다.

etc/bashrc

# /etc/bashrc

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

bash 쉘이 실행되는 경우에 로그인 계정에 상관없이 전역적으로 영향을 미치는 파일입니다. "시스템 함수, 별칭 등을 설정하라"는 주석의 설명이 있습니다. 환경 관련해서는 /etc/profile로 가라고 안내합니다. 즉, 환경변수는 bashrc가 아닌 profile에서 설정하라는 게 제가 쓰는 CentOS 7의 공식적인 가이드라고 할 수 있습니다.

etc/profile

# /etc/profile

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

etc/profile 역시 함수나 별칭 설정은 /etc/bashrc로 가라고 역으로 안내하고 있습니다.

~/.bash_profile

이제 사용자 계정별 파일들을 설명드리겠습니다. 우선 ~/ 경로로 이동해서 .bash_profile과 .bashrc 파일을 찾아보세요. 못 찾으실 수도 있습니다. 숨겨져 있어서 그냥 ls 명령어로는 조회가 되지 않기 때문입니다. vi ~/.bash_profile 명령어로만 접근해보셨다면 모르고 계셨을 겁니다. 숨겨진 파일은 a 옵션을 붙이면 확인이 가능합니다.

[root@localhost ~]# cd ~/
[root@localhost ~]# ls -a
.                .bash_history  .bashrc  .cshrc    .mysql_history   .tcshrc
..               .bash_logout   .cache   line.txt  original-ks.cfg  test.txt
anaconda-ks.cfg  .bash_profile  .config  mysql     .psql_history    .viminfo
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

 

.bash_profile은 bash로 로그인할 때 로드되는 파일입니다. PATH 환경변수가 기본 지정되어 있는 게 확인됩니다. PATH, LD_LIBRARY_PATH 등 환경변수를 지정하기 적합하다는 의미입니다.

~/.bashrc

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

반면 ~.bashrc에는 rm, cp, mv 등의 alias가 기본 지정되어 있는 것이 확인됩니다. 

bash 로그인 시 실행 순서

사용자 로그인으로 bash가 실행될 때 위에서 설명한 스크립트 파일은 순차적으로 실행되며 환경을 설정합니다. 실행 순서는 아래와 같습니다.

 

1. /etc/profile

2. ~/.bash_profile

3. ~/.bashrc

4. /etc/bashrc

환경변수를 ~/.bash_profile에 설정하는 이유

결론으로 다시 돌아와서, PATH, LD_LIBRARY_PATH 등 환경변수를 지정하기에 ~/.bash_profile가 왜 적당한지 정리해보겠습니다.

 

1. 리눅스 배포판에서 기본 쉘은 bash입니다. 이 경우 ~/.profile 대신 ~/.bash_profile을 수정하면 됩니다. 

2. 리눅스 배포판에서 주석을 통해 환경변수는 profile에, 함수나 별칭 등은 bashrc에 하라고 권고하고 있습니다.

3. /etc/profile을 수정하는 건 리스크가 큽니다. 환경변수 적용이 필요한 특정 계정에 설정하는 게 더 안전합니다. ~/.bash_profile에서 아래와 같이 $PATH를 사용해 전역 환경변수를 설정을 이어받으면 됩니다. 

PATH=$PATH:/path/setting

 

반응형

댓글

Designed by JB FACTORY