기타 / 자격증 / 리눅스마스터 2급 / 6강

6편 · 셸 — 개념·환경 변수·히스토리·프롬프트

이번 강의에서 배울 것

  • sh·csh·ksh·tcsh·bash·zsh의 계보와 특징을 구분하고, 현재·로그인 셸을 확인하고 바꾼다.
  • 셸 변수와 환경 변수의 차이를 말하고 export·env·set·unset으로 다룬다.
  • 로그인 셸과 비로그인 셸에서 bash 설정 파일이 실행되는 순서를 쓴다.
  • alias, history 확장(!!, !n, !문자열), PS1 이스케이프를 읽고 쓴다.

학습 경로 · 2과목 2장

← 5편 · 파일 시스템 명령어와 물리 구조 · 다음: 7편 · 프로세스 관리 →

범위: 2과목 2장 "셸" — 셸의 개념과 종류, 환경 변수와 셸 변수, 셸 환경 설정 파일, alias와 history, 프롬프트(PS1).

형광펜 읽는 법: 노랑 핵심 정의·결론 · 빨강 시험에서 헷갈리는 구분·함정 · 파랑 외워야 할 순서·목록


단원 도입

출제 포인트빈도이렇게 나온다
셸 종류와 개발자·특징 (sh, csh, ksh, bash, zsh)★★★"Bill Joy가 만든 C 언어 문법의 셸은?", 발전 순서
로그인 셸 확인·변경 (echo $SHELL, /etc/shells, chsh)★★★사용 가능한 셸 목록 파일, chsh -s 결과
환경 변수 이름과 의미 (PATH, HOME, PS1, HISTSIZE…)★★★설명 → 변수 이름 고르기
export, env, set, unset 구분★★★"환경 변수만 출력", "셸 변수까지 모두 출력"
설정 파일 실행 순서★★★/etc/profile → ~/.bash_profile → ~/.bashrc → /etc/bashrc
history 확장 (!!, !n, !-n, !문자열)★★출력 결과 고르기
PS1 이스케이프 (\u \h \w \W \t \$)★★프롬프트 모양 → PS1 값
alias / unalias★★별칭 설정·해제 명령

PART 1 · 셸이란 무엇이고 어떤 것이 있나

1. 셸의 개념과 기능

핵심 필기

  • 명령어 해석기: 프롬프트에서 받은 명령을 해석해 실행한다.
  • 프로그래밍 언어: 변수·조건·반복을 쓰는 셸 스크립트를 실행한다(인터프리터 방식, 컴파일 불필요).
  • 사용자 환경 설정: 환경 변수, 별칭, 프롬프트 등 개인 환경을 설정 파일로 구성한다.
사용자 ──(명령 입력)──▶ 셸 ──(시스템 호출)──▶ 커널 ──▶ 하드웨어
        ◀──(결과 출력)──

2. 셸의 종류

핵심 필기

셸경로개발특징기본 프롬프트
sh (Bourne shell)/bin/sh스티븐 본(Stephen Bourne), AT&T 벨 연구소, 1977유닉스 최초의 표준 셸, 단순·빠름, 히스토리·별칭 없음$
csh (C shell)/bin/csh빌 조이(Bill Joy), 버클리(BSD)C 언어와 비슷한 문법, 히스토리·별칭·작업 제어 도입%
ksh (Korn shell)/bin/ksh데이비드 콘(David Korn), AT&T, 1983sh와 호환되면서 csh의 히스토리·별칭 기능 추가$
tcsh/bin/tcshcsh 확장판csh 호환 + 명령행 편집, 자동 완성>
bash (Bourne Again Shell)/bin/bash브라이언 폭스(Brian Fox), GNU 프로젝트, 1989sh 호환 + csh·ksh 장점, 대부분 리눅스의 기본 셸$
dash (Debian Almquist shell)/bin/dashash 계열가볍고 빠름, 데비안·우분투의 /bin/sh$
zsh (Z shell)/bin/zsh폴 팔스타드(Paul Falstad), 1990ksh 기반에 bash·tcsh 기능을 대거 흡수, 강력한 자동 완성·테마%

계보로 묶어 외우기

  • Bourne 계열: sh → ksh → bash → zsh (스크립트 문법이 sh와 호환)
  • C 셸 계열: csh → tcsh

3. 현재 셸 확인과 로그인 셸 변경

핵심 필기

목적명령·파일
로그인 셸 확인echo $SHELL (환경 변수 SHELL), /etc/passwd의 7번째 필드
지금 실행 중인 셸 확인echo $0, ps
사용 가능한 셸 목록/etc/shells, chsh -l (Red Hat 계열 util-linux의 chsh)
로그인 셸 변경chsh -s /bin/csh 사용자, usermod -s /bin/csh 사용자
잠시 다른 셸 쓰기셸 이름 입력(예: csh) → 자식 셸 실행, exit로 복귀
$ echo $SHELL
/bin/bash
$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/dash
$ grep '^kim:' /etc/passwd
kim:x:1001:1001::/home/kim:/bin/bash
$ chsh -s /bin/sh kim          # 다음 로그인부터 /bin/sh
$ grep '^kim:' /etc/passwd
kim:x:1001:1001::/home/kim:/bin/sh

PART 2 · 변수와 설정 파일

4. 셸 변수와 환경 변수

핵심 필기

구분셸 변수(지역 변수)환경 변수(전역 변수)
범위현재 셸에서만 유효현재 셸 + 자식 프로세스에 상속
만드는 법NAME=valueexport NAME=value 또는 NAME=value; export NAME
확인set (셸 변수 + 환경 변수 + 함수 전부)env, printenv, export (환경 변수만)

변수 다루는 명령

명령역할
NAME=value셸 변수 선언 — 등호 양쪽에 공백이 없어야 한다
echo $NAME변수 값 출력
export NAME셸 변수를 환경 변수로 바꾼다
export -n NAME환경 변수 속성만 제거(셸 변수로 남음)
unset NAME변수 자체를 삭제
set셸 변수·환경 변수·함수 모두 출력
env / printenv환경 변수만 출력 (printenv HOME처럼 하나만도 가능)
readonly NAME읽기 전용 변수로 만든다
$ A=10
$ bash -c 'echo "child A=[$A]"'     # 자식 셸에는 안 보인다
child A=[]
$ export A
$ bash -c 'echo "child A=[$A]"'     # export 후에는 상속된다
child A=[10]
$ unset A
$ echo "A=[$A]"
A=[]

주요 환경 변수

변수의미
HOME사용자 홈 디렉터리
PATH명령을 찾을 디렉터리 목록(:로 구분)
PWD / OLDPWD현재 / 직전 작업 디렉터리 (cd -가 OLDPWD 사용)
USER, LOGNAME사용자 이름 / 로그인 이름
UID사용자 UID
SHELL로그인 셸 경로
HOSTNAME호스트 이름
TERM터미널 종류
LANG언어·로캘 (예: ko_KR.UTF-8)
MAIL메일 수신함 경로
PS1 / PS2기본 프롬프트 / 2차 프롬프트(명령이 다음 줄로 이어질 때, 기본 > )
HISTFILE히스토리 저장 파일 (기본 ~/.bash_history)
HISTSIZE메모리에 기억할 히스토리 개수
HISTFILESIZE히스토리 파일에 저장할 최대 줄 수
TMOUT입력이 없으면 자동 로그아웃할 초
DISPLAYX 윈도우 출력 위치 (11편)

특수 변수(셸이 자동으로 채움)

변수의미
$$현재 셸의 PID
$?직전 명령의 종료 상태(0이면 성공)
$!마지막 백그라운드 작업의 PID
$0실행 중인 셸·스크립트 이름
$1…$9위치 매개변수(인자)
$#인자 개수
$*, $@모든 인자
$ false; echo $?
1
$ true; echo $?
0
$ set -- a b c; echo $# $1 $@
3 a a b c

따옴표와 명령 치환

표기동작
'…' 작은따옴표안의 모든 문자를 글자 그대로 (변수 치환 안 함)
"…" 큰따옴표$, 백틱, \만 해석하고 나머지는 글자 그대로
백틱 또는 $(…)명령 치환 — 명령을 실행한 결과로 바꾼다
\바로 뒤 한 글자의 특수 의미를 없앤다
$ echo '$HOME' "$HOME" $(echo hi) \$HOME
$HOME /root hi $HOME

5. 셸 환경 설정 파일과 실행 순서

핵심 필기

파일적용 대상실행 시점주로 넣는 것
/etc/profile시스템 전체 사용자로그인할 때환경 변수(PATH 등), 시작 프로그램
/etc/profile.d/*.sh시스템 전체/etc/profile이 불러옴패키지별 환경 설정
/etc/bashrc (데비안 계열은 /etc/bash.bashrc)시스템 전체bash가 실행될 때 (~/.bashrc가 불러옴)전역 alias, 함수, 기본 PS1
~/.bash_profile개인로그인할 때개인 환경 변수, 시작 프로그램
~/.bash_login, ~/.profile개인~/.bash_profile이 없을 때 대신데비안 계열은 ~/.profile 사용
~/.bashrc개인bash가 실행될 때마다개인 alias, 함수
~/.bash_logout개인로그아웃할 때화면 지우기, 임시 파일 정리
~/.bash_history개인셸 종료 시 기록명령 히스토리

로그인 셸의 실행 순서 (Red Hat 계열 기준)

/etc/profile → ~/.bash_profile → ~/.bashrc → /etc/bashrc

  • /etc/profile이 먼저 읽히고 그 안에서 /etc/profile.d/*.sh를 불러온다.
  • ~/.bash_profile은 안에서 ~/.bashrc를 불러오고, ~/.bashrc가 다시 /etc/bashrc를 불러온다.
  • 로그인하지 않고 터미널 창만 새로 연 비로그인 대화형 셸은 ~/.bashrc(→ /etc/bashrc)만 읽는다.
  • 로그아웃 시 ~/.bash_logout이 실행된다.

로그인 셸은 /etc/profile, profile.d, ~/.bash_profile, ~/.bashrc, /etc/bashrc 순으로 읽고 비로그인 셸은 ~/.bashrc부터 읽으며 로그아웃 시 ~/.bash_logout이 실행되는 흐름도

그림 6-1 · bash 설정 파일이 읽히는 순서 — 누르면 원본 크기로 열린다.

$ cat ~/.bash_profile
# .bash_profile
if [ -f ~/.bashrc ]; then
        . ~/.bashrc                 # 개인 bashrc를 불러온다
fi
PATH=$PATH:$HOME/bin
export PATH
$ vi ~/.bashrc                      # alias를 추가한 뒤
$ source ~/.bashrc                  # 또는 . ~/.bashrc — 다시 로그인하지 않고 즉시 적용

PART 3 · 편의 기능 — alias, history, 프롬프트

6. alias — 명령에 별명 붙이기

핵심 필기

명령역할
alias현재 설정된 별칭 전체 출력
alias 이름='명령'별칭 설정 (= 양쪽 공백 없음)
alias 이름해당 별칭만 출력
unalias 이름별칭 해제
unalias -a모든 별칭 해제
\명령그 순간만 별칭을 무시하고 원래 명령 실행
$ alias ll='ls -l'
$ alias ll
alias ll='ls -l'
$ type ll
ll is aliased to `ls -l'
$ unalias ll
$ type ll
bash: type: ll: not found

7. history — 명령 기록과 재실행

핵심 필기

명령뜻
history기록 전체를 번호와 함께 출력
history 10최근 10개만 출력
history -c메모리의 기록 삭제
history -w현재 기록을 히스토리 파일에 기록
!!바로 직전 명령 재실행
!nn번 명령 재실행
!-nn번째 이전 명령 재실행 (!-1 = !!)
!문자열그 문자열로 시작하는 가장 최근 명령
!?문자열?그 문자열을 포함하는 가장 최근 명령
^old^new직전 명령의 old를 new로 바꿔 실행
!$직전 명령의 마지막 인자
!^ / !*직전 명령의 첫 인자 / 모든 인자
fc -l기록 목록 (history와 비슷)

관련 변수: HISTSIZE(메모리 개수), HISTFILESIZE(파일 줄 수), HISTFILE(파일 경로), HISTTIMEFORMAT(시간 표시 형식), HISTCONTROL(ignoredups 연속 중복 무시, ignorespace 공백으로 시작하는 명령 무시, ignoreboth 둘 다).

8. 프롬프트 — PS1 이스케이프

핵심 필기

PS1은 기본 프롬프트 문자열이고, 백슬래시 이스케이프로 정보를 끼워 넣는다. Red Hat 계열 기본값은 PS1='[\u@\h \W]\$ ' → [root@server1 ~]#.

이스케이프뜻예
\u사용자 이름kim
\h호스트 이름(첫 번째 . 앞까지)server1
\H호스트 이름 전체server1.example.com
\w현재 디렉터리 전체 경로 (홈은 ~)/usr/local/bin
\W현재 디렉터리의 마지막 이름만bin
\t24시간 HH:MM:SS17:19:57
\T12시간 HH:MM:SS05:19:57
\@12시간 am/pm05:19 PM
\A24시간 HH:MM17:19
\d"요일 월 일"Fri Oct 30
\s셸 이름bash
\v / \Vbash 버전 / 버전+패치5.2 / 5.2.21
\!이 명령의 히스토리 번호512
\#이 셸에서 실행한 명령 번호7
\j현재 작업(job) 개수0
\$root면 #, 일반 사용자면 $#
\n줄바꿈
\\백슬래시 문자
$ cd /usr/local/bin
$ PS1='\w|\W|\t|\T|\@|\A|\d|\s|\v|\V|\$ '
/usr/local/bin|bin|17:19:57|05:19:57|05:19 PM|17:19|Fri Oct 30|bash|5.2|5.2.21|# 
$ PS1='[\u@\h \W]\$ '
[root@vm bin]#

위 출력은 root로 실행했기 때문에 \$가 #로 바뀌었다.

기출 유형 연습

다음 중 셸에 대한 설명으로 틀린 것은?

보기를 선택해 주세요.
힌트 1 보기

csh를 확장한 셸은 이름 앞에 한 글자가 더 붙는다.

정답·해설 보기

C. ksh(Korn shell)는 David Korn이 만든 Bourne 셸 호환 셸이다. csh를 확장한 것은 tcsh다.

사용자가 로그인할 때 bash 설정 파일이 실행되는 순서로 옳은 것은? (Red Hat 계열 기준)

보기를 선택해 주세요.
힌트 1 보기

시스템 전체 profile이 가장 먼저이고, 개인 profile이 개인 bashrc를 부른다.

정답·해설 보기

B. /etc/profile → ~/.bash_profile → ~/.bashrc → /etc/bashrc. ~/.bash_logout은 로그아웃 때 실행되므로 로그인 순서에 끼지 않는다.

다음 명령을 차례로 입력했을 때 마지막 줄의 출력은?

$ NAME=linux
$ bash
$ echo "[$NAME]"
보기를 선택해 주세요.
힌트 1 보기

bash를 입력하면 새 자식 셸이 뜬다. export를 했는가?

정답·해설 보기

B. NAME은 export하지 않은 셸 변수라 자식 셸에 상속되지 않는다. 큰따옴표 안의 $NAME은 치환되지만 값이 비어 있어 []가 출력된다.

프롬프트에 "사용자이름@호스트명 현재디렉터리의 마지막 이름"과 root 여부 기호가 나오도록 하는 설정은?

보기를 선택해 주세요.
힌트 1 보기

기본 프롬프트 변수 이름과 \W(대문자)의 뜻을 떠올린다.

정답·해설 보기

A. \u 사용자, \h 호스트, \W 마지막 디렉터리 이름, \$는 root면 #. C는 2차 프롬프트 PS2, D의 \U는 PS1 이스케이프가 아니고 #은 고정 문자다.

환경 변수에 대한 설명으로 옳지 않은 것은?

보기를 선택해 주세요.
힌트 1 보기

셸 변수까지 보여 주는 명령은 set이다.

정답·해설 보기

B. env(와 printenv)는 환경 변수만 출력한다. 셸 변수까지 모두 보려면 set.

단원 마무리

장 요약

주제꼭 기억할 것
셸 종류Bourne 계열 sh → ksh → bash → zsh, C 계열 csh → tcsh. bash = GNU, Brian Fox
셸 확인·변경echo $SHELL, echo $0, /etc/shells, chsh -s, /etc/passwd 7번째 필드
변수셸 변수는 현재 셸만, export하면 환경 변수로 상속. set은 전부, env는 환경 변수만
설정 파일/etc/profile → ~/.bash_profile → ~/.bashrc → /etc/bashrc, 로그아웃 ~/.bash_logout
aliasalias 이름='명령', unalias, 영구 설정은 ~/.bashrc
history!! 직전, !n n번, !-n n개 전, !문자열 시작, ^a^b 치환. HISTSIZE(메모리) vs HISTFILESIZE(파일)
PS1\u 사용자, \h 호스트, \w 전체 경로, \W 마지막 이름, \t 24시간, \$ root면 #

책을 덮고 꺼내 보기

  • 사용 가능한 로그인 셸 목록 파일은 다.
  • C 셸을 확장해 명령행 편집을 넣은 셸은 다.
  • 셸 변수를 환경 변수로 바꾸는 명령은 다.
  • 환경 변수만 출력하는 명령은 또는 printenv다.
  • 로그인할 때 모든 사용자에게 적용되는 설정 파일은 이다.
  • 로그아웃할 때 실행되는 파일은 이다.
  • 직전 명령을 다시 실행하는 히스토리 확장은 다.
  • PS1에서 현재 디렉터리 전체 경로는 , 마지막 이름만은 다.
sh, csh, ksh, bash의 개발자는?

sh — Stephen Bourne(AT&T), csh — Bill Joy(BSD), ksh — David Korn(AT&T), bash — Brian Fox(GNU 프로젝트).

로그인 셸을 확인·변경하는 방법은?

확인은 echo $SHELL 또는 /etc/passwd 7번째 필드, 변경은 chsh -s 셸경로 사용자 또는 usermod -s. 사용 가능 목록은 /etc/shells(chsh -l).

set, env, export의 차이는?

set은 셸 변수·환경 변수·함수를 모두, env/printenv는 환경 변수만 출력한다. export NAME은 셸 변수를 환경 변수로 만든다(인자 없이 쓰면 환경 변수 목록).

로그인 셸의 bash 설정 파일 실행 순서는?

/etc/profile(→ /etc/profile.d/*.sh) → ~/.bash_profile → ~/.bashrc → /etc/bashrc. 비로그인 셸은 ~/.bashrc부터. 로그아웃은 ~/.bash_logout.

!n, !-n, !문자열, !?문자열? 의 차이는?

!n은 n번 명령, !-n은 n개 전 명령, !문자열은 그 문자열로 시작하는 최근 명령, !?문자열?은 그 문자열을 포함하는 최근 명령.

HISTSIZE와 HISTFILESIZE의 차이는?

HISTSIZE는 셸이 메모리에 기억하는 개수, HISTFILESIZE는 ~/.bash_history 파일에 저장하는 최대 줄 수.

PS1 이스케이프 \u \h \w \W \t $ 의 뜻은?

사용자 이름, 호스트 이름(첫 점 앞), 현재 디렉터리 전체 경로, 현재 디렉터리 마지막 이름, 24시간 시각, root면 # 아니면 $.

다음으로 갈 기준: 설정 파일 네 개의 순서와 set/env 차이를 보지 않고 말할 수 있으면 다음 편으로 간다: 7편 · 프로세스 관리.

정답과 해설

확인 문제 정답

  1. /etc/shells — 레드햇 계열에서는 chsh -l로도 볼 수 있다.
  2. csh(C shell)와 그 확장판 tcsh.
  3. chsh -s /bin/zsh lee, usermod -s /bin/zsh lee — 다음 로그인부터 적용된다.
  4. export (export NAME 또는 export NAME=value).
  5. 전부 출력은 set, 환경 변수만은 env(또는 printenv).
  6. ~/.bash_logout.
  7. 직전 명령은 !!, vi로 시작하는 최근 명령은 !vi.
  8. PS1='\u@\h:\w\$ ' — /var/log 전체 경로가 나와야 하므로 소문자 \w, 일반 사용자라 \$가 $로 표시된다.
  9. HISTFILESIZE — 메모리 쪽은 HISTSIZE.
오늘도 한 걸음 앞으로.

내용을 이해했다면 학습 완료를 체크해 주세요.

학습 기록은 현재 브라우저에 저장됩니다.
HJS / STUDY한지석