- 설정 파일은 전역(
/etc/)과 사용자(~/) 두 층으로 나뉜다. 전역을 먼저 읽고 사용자 것으로 덮는다. - 로그인 셸은
/etc/profile→~/.bash_profile순으로 읽는다. - 비로그인 셸(터미널 창을 새로 열 때)은
~/.bashrc를 읽는다. - 로그아웃할 때는
~/.bash_logout이 실행된다. - 고친 설정을 다시 로그인하지 않고 적용하려면
source또는.을 쓴다.
기준: 리눅스마스터 2급 출제 기준오류 제보
/etc/)과 사용자(~/) 두 층으로 나뉜다. 전역을 먼저 읽고 사용자 것으로 덮는다./etc/profile → ~/.bash_profile 순으로 읽는다.~/.bashrc 를 읽는다.~/.bash_logout 이 실행된다.source 또는 . 을 쓴다. 전역 (모든 사용자) 사용자 (나만)
┌──────────────────┐ ┌──────────────────┐
로그인 │ /etc/profile │ → │ ~/.bash_profile │
└──────────────────┘ └──────────────────┘
비로그인 │ /etc/bashrc │ → │ ~/.bashrc │
└──────────────────┘ └──────────────────┘
로그아웃 ~/.bash_logout| 축 | 가르는 것 |
|---|---|
| 전역 vs 사용자 | /etc/ 아래는 모두에게, ~/ 아래는 그 사람에게만 |
| 로그인 vs 비로그인 | 로그인 과정을 거쳤나, 아니면 이미 로그인한 상태에서 셸만 새로 띄웠나 |
| 파일 | 범위 | 언제 |
|---|---|---|
/etc/profile | 전역 | 로그인할 때 |
/etc/bashrc (/etc/bash.bashrc) | 전역 | 셸을 새로 띄울 때 |
~/.bash_profile | 개인 | 로그인할 때 |
~/.bash_login, ~/.profile | 개인 | .bash_profile이 없을 때 대신 |
~/.bashrc | 개인 | 셸을 새로 띄울 때 |
~/.bash_logout | 개인 | 로그아웃할 때 |
배포판마다 파일 이름이 조금 다르다. 전역 bashrc가 레드햇 계열은
/etc/bashrc, 데비안 계열은/etc/bash.bashrc다.
| 적을 내용 | 두는 곳 | 이유 |
|---|---|---|
환경 변수(PATH, LANG) | .bash_profile | 한 번만 설정하면 자식에게 전달된다 |
별칭(alias), 프롬프트 | .bashrc | 셸마다 새로 필요하다 |
export로 자식에게 물려주므로 로그인할 때 한 번이면 충분하다.# ~/.bash_profile (레드햇 계열 기본 내용)
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH# ~/.bashrc (레드햇 계열 기본 내용에 별칭 한 줄을 더한 예)
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
alias ll='ls -l'[ -f 파일 ]은 "그 파일이 있으면", .은 source 다. 즉 ".bashrc가 있으면 지금 셸에서 읽어라"는 뜻이다..bash_profile이 .bashrc를, .bashrc가 /etc/bashrc를 부르는 구조다. bash가 알아서 다 읽는 것이 아니라 파일 안에 적힌 한 줄이 다음 파일을 불러 준다.~/.bash_profile 대신 ~/.profile 을 기본으로 주고 그 안에서 ~/.bashrc를 부른다. 전역 /etc/bash.bashrc는 bash가 직접 읽는다. 배포판마다 연결 방식이 다르지만 "로그인용 파일이 bashrc를 불러 준다"는 뼈대는 같다./etc/profile.d/ — 전역 설정을 나눠 담는 곳ls /etc/profile.d/
# colorls.sh lang.sh less.sh vim.sh which2.sh/etc/profile은 끝부분에서 이 디렉터리의 *.sh 파일을 전부 읽는다./etc/profile을 직접 고치지 않고 자기 파일 하나를 여기에 넣는 방식이다. 지울 때도 그 파일만 지우면 된다./etc/profile을 고치기보다 여기에 .sh 파일을 새로 만드는 쪽이 안전하다./etc/skel — 새 계정의 설정 파일이 오는 곳ls -a /etc/skel
# . .. .bash_logout .bash_profile .bashrcuseradd로 계정을 만들 때 이 디렉터리의 파일들이 새 홈 디렉터리로 복사된다. skel은 skeleton(뼈대)의 줄임말이다.콘솔 로그인, SSH 접속, su - 일 때다.
1. /etc/profile 전역
│
└─► /etc/profile.d/*.sh (여기서 나눠 담기도 한다)
2. ~/.bash_profile 개인
│
└─► ~/.bashrc (대개 여기서 불러 준다)
│
└─► /etc/bashrc~/.bash_profile이 없으면 ~/.bash_login을, 그것도 없으면 ~/.profile을 읽는다. 셋 중 먼저 찾은 하나만 읽는다..bash_profile 안에 .bashrc를 불러오는 줄을 넣어 둔다. 그래야 로그인 셸에서도 별칭이 적용된다.이미 로그인한 상태에서 터미널 창을 새로 열거나 bash를 실행할 때다.
~/.bashrc
│
└─► /etc/bashrc/etc/profile과 ~/.bash_profile은 읽지 않는다..bash_profile에만 적어 둔 환경 변수는 부모 셸에서 물려받아 쓰게 된다.| 상황 | 로그인 셸인가 |
|---|---|
| SSH 접속 | 로그인 셸 |
| 콘솔 로그인 | 로그인 셸 |
su - | 로그인 셸 |
su (하이픈 없이) | 비로그인 |
| 터미널 창 새로 열기 | 비로그인 |
bash 실행 | 비로그인 |
su와su -의 차이가 여기서 갈린다. 하이픈을 붙이면 로그인 셸로 시작해/etc/profile부터 다시 읽으므로 환경이 완전히 전환된다.
echo $0
# -bash ← 앞에 하이픈이 있으면 로그인 셸
shopt login_shell
# login_shell on
bash # 셸을 하나 더 띄운다
echo $0
# bash
shopt login_shell
# login_shell off~/.bash_profile 의 첫 줄에 echo ">> .bash_profile", ~/.bashrc 의 첫 줄에 echo ">> .bashrc" 를 넣고 다음을 해 본다.
| 해 본 일 | 화면에 찍히는 것 | 읽은 파일 |
|---|---|---|
| SSH로 새로 접속 | >> .bash_profile 다음에 >> .bashrc | 둘 다 (profile이 bashrc를 불렀다) |
그 안에서 bash 실행 | >> .bashrc 만 | bashrc만 |
bash script.sh 로 스크립트 실행 | 아무것도 없음 | 둘 다 읽지 않는다 |
.bashrc도 읽지 않는다. 그래서 .bashrc에 만든 별칭이 스크립트 안에서는 통하지 않는다.scp 같은 파일 전송이 실패할 수 있다.su와 su -를 나란히 놓고 보기[user@server1 work]$ su
Password:
[root@server1 work]# pwd
/home/user/work ← 있던 자리 그대로다
[root@server1 work]# exit
[user@server1 work]$ su -
Password:
[root@server1 ~]# pwd
/root ← root 의 홈으로 옮겨졌고 환경도 root 것이다su는 사용자만 바꾸고 작업 디렉터리와 기존 환경 변수 대부분을 그대로 둔다.su -는 root로 새로 로그인한 것과 같은 상태를 만든다. /etc/profile과 root의 ~/.bash_profile을 처음부터 읽는다.su - alice 처럼 하이픈 뒤에 사용자 이름을 쓰면 그 사용자의 로그인 셸로 들어간다.source ~/.bashrc # 현재 셸에서 다시 읽기
. ~/.bashrc # 점 하나도 같은 뜻source와 .(점)은 같은 명령이다.source로 다시 읽어야 한다.bash ~/.bashrc 처럼 실행하면 안 된다. 새 셸에서 읽고 끝나 버려 현재 셸에는 남지 않는다. source는 현재 셸 안에서 실행한다는 점이 핵심이다.| 표기 | 뜻 |
|---|---|
. ~/.bashrc | 점 다음에 공백이 있다 — source와 같다. 현재 셸에서 읽는다 |
./script.sh | 점과 슬래시가 붙어 있다 — "현재 디렉터리의 그 파일"을 실행한다 |
source는 파일을 읽기만 하므로 실행 권한이 없어도 된다. ./script.sh 로 실행하려면 실행 권한이 필요하다..bash_profile을 고쳤으면 source ~/.bash_profile 이다.# ~/.bashrc 에 export PATH=$PATH:/opt/bin 이 적혀 있을 때
source ~/.bashrc
source ~/.bashrc
echo $PATH
# /usr/local/bin:/usr/bin:/opt/bin:/opt/bin:/opt/bin⚠️
source를 할 때마다 그 줄이 다시 실행된다.$PATH뒤에 덧붙이는 줄은 읽을 때마다 같은 경로가 한 번씩 더 붙는다. 동작에는 문제가 없지만, 값을 지우고 싶어 줄을 삭제한 뒤source해도 이미 붙은 값은 사라지지 않는다. 그때는 다시 로그인한다.
# ~/.bash_logout 예
clear # 화면 지우기
rm -f ~/tmp/* # 임시 파일 정리| 하고 싶은 일 | 고칠 곳 |
|---|---|
모든 사용자의 PATH에 경로 추가 | /etc/profile (또는 /etc/profile.d/ 에 .sh 파일 추가) |
| 모든 사용자에게 같은 별칭 | /etc/bashrc |
| 나만 쓰는 환경 변수 | ~/.bash_profile |
| 나만 쓰는 별칭·프롬프트 | ~/.bashrc |
| 앞으로 만들 계정의 기본 설정 | /etc/skel/ 아래 파일 |
| 로그아웃할 때 자동 정리 | ~/.bash_logout |
| 고친 내용을 지금 바로 적용 | source 파일 |
| 함께 보기에 나오지만 설정 파일이 아닌 것 | 실제 역할 |
|---|---|
~/.bash_history | 실행한 명령의 이력이 쌓이는 파일 |
/etc/shells | 사용할 수 있는 셸 목록 |
/etc/passwd | 계정 정보. 7번째 필드가 로그인 셸 |
내일은 명령의 입력과 출력을 다른 곳으로 돌리는 리다이렉션, 그리고 별칭과 히스토리를 다룬다.
/etc/profile과 ~/.bash_profile을 읽는다.~/.bashrc만 읽는다./etc/profile : 모든 사용자에게 적용되는 전역 로그인 설정 파일.~/.bash_profile : 개인의 로그인 설정 파일. 주로 환경 변수를 둔다.~/.bashrc : 셸을 띄울 때마다 읽는 개인 설정 파일. 주로 별칭과 프롬프트를 둔다.~/.bash_logout : 로그인 셸에서 로그아웃할 때 실행되는 파일.source : 설정 파일을 현재 셸에서 다시 읽어 즉시 반영하는 명령. .과 같다./etc/profile.d/ : 전역 로그인 설정을 파일별로 나눠 담는 디렉터리. /etc/profile이 여기의 *.sh를 읽는다./etc/skel : 새 계정을 만들 때 홈 디렉터리로 복사되는 기본 설정 파일들이 있는 곳.선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
다음 중 터미널 창을 새로 열 때처럼 비로그인 셸이 시작될 때 읽히는 개인 설정 파일로 알맞은 것은?
문제 2
다음 중 모든 사용자에게 공통으로 적용되는 전역 로그인 설정 파일로 알맞은 것은?
문제 3
다음 중 수정한 설정 파일을 다시 로그인하지 않고 현재 셸에 즉시 반영하는 명령으로 알맞은 것은?
문제 4
다음 중 로그아웃할 때 실행되는 설정 파일로 알맞은 것은?
문제 5
다음 중 로그인 셸에서 ~/.bash_profile 파일이 존재하지 않을 때 대신 읽히는 파일로 알맞은 것은?