CertNote/ 출퇴근 학습 노트
로드맵
KOEN
리눅스마스터 2급 · 2급리눅스마스터 2급
리눅스마스터 1급 · 1급리눅스마스터 1급
  • Week 1
    • 1.운영체제와 리눅스: 커널이 하는 일
    • 2.자유 소프트웨어와 배포판: 라이선스가 만든 생태계
    • 3.설치와 부팅: 전원을 켜는 순간부터
    • 4.파일시스템 구조와 파일의 종류: 모든 것은 파일이다
    • 5.Week 1 종합 복습: 개념을 꿰뚫는 시간
  • Week 2
  • Week 3
    • 1.셸의 정체: 명령을 해석하는 프로그램과 변수의 세계
    • 2.흐름을 잇고 비트는 기술: 리다이렉션, 파이프, 메타문자
    • 3.셸을 길들이다: 별칭, 히스토리, 그리고 작업 제어
    • 4.셸 스크립트: 명령을 코드로 엮는 첫걸음
    • 5.Week 3 종합 복습: 셸과 스크립트의 큰 그림
  • Week 4
  • Week 5
  • Week 6
  • Week 7
  • Week 8
  • Week 9
  • Week 10
  • Week 11
  • Week 12
  • Week 13
  • Week 14
합격 후기

© CertNote · 주간랩스

  • 소개
  • 수정 기록
  • 문의
  • 이용약관
  • 개인정보처리방침
← 리눅스마스터 1급/Week 3/Day 1

기준: 리눅스마스터 1급 출제 기준·오류 제보

리눅스마스터 1급· AssociateWeek 3 · Day 1읽기 약 11분
핵심 정리
  • 셸은 커널과 사용자 사이의 명령어 해석기다. 읽고-해석하고-실행하고-기다리는 REPL을 반복한다.
  • 셸은 본 계열(sh→ksh→bash→zsh)과 C 계열(csh→tcsh)로 갈린다. 리눅스 표준은 bash.
  • 변수는 export 여부로 갈린다 — 셸 변수는 자식에게 상속 안 됨, 환경 변수는 상속됨(부모로는 절대 안 감).
  • set(셸+환경+함수) · env(환경만) · export(승격)의 범위 차이가 출제 포인트다.
  • 초기화 파일: 로그인 셸은 /etc/profile → ~/.bash_profile, 대화형 셸은 /etc/bashrc → ~/.bashrc. 즉시 적용은 source.

Day 1 - 셸의 정체: 명령을 해석하는 프로그램과 변수의 세계

셸이란 무엇인가: 커널과 사용자 사이의 통역사

1971년 톰슨 셸부터 1977년 본 셸(sh), 1989년 Bash까지 — 셸은 리눅스를 쓰는 사람이 가장 먼저, 가장 자주 마주치는 프로그램이다. 1급에서 셸은 단순한 "명령 입력기"가 아니라 하나의 인터프리터 언어이자 사용자 환경으로 다뤄진다.

  • 리눅스 시스템은 크게 커널(kernel)과 셸(shell)로 나뉜다.
  • 커널은 하드웨어를 직접 제어하는 핵심이고, 셸은 사용자 입력을 커널이 이해할 형태로 전달하는 명령어 해석기(command interpreter)다.
  • 셸이라는 이름 자체가 "껍데기"라는 뜻 — 커널을 둘러싸 사용자와 맞닿는 가장 바깥층이기 때문이다.
1. 프롬프트 출력 → 사용자 입력 대기
2. 입력 라인 읽기 (read)
3. 토큰 분리 + 메타문자/와일드카드 확장 (parsing & expansion)
4. 변수 치환, 명령 치환 수행
5. 빌트인 명령인지 외부 명령인지 판별
6. 외부 명령이면 PATH에서 실행 파일 검색
7. fork() → exec()로 자식 프로세스 생성·실행
8. wait()로 종료 대기 후 종료 코드 회수
9. 다시 프롬프트 출력
  • 이 한 사이클(REPL: Read-Eval-Print Loop)을 셸은 로그아웃할 때까지 반복한다.

셸은 "대화형 셸(interactive shell)"과 "비대화형 셸(non-interactive shell)"로 나뉜다. 터미널에서 직접 타이핑하면 대화형, 스크립트 파일을 실행하면 비대화형이다. 둘은 읽는 초기화 파일이 다르다 — 이 차이가 오늘 마지막 주제의 핵심이다.

셸의 종류와 특징: sh, csh, ksh, bash, zsh

시험에서는 각 셸의 개발자·계열·특징을 묻는다. 크게 본 셸 계열(sh → ksh → bash)과 C 셸 계열(csh → tcsh)로 나뉜다.

셸이름개발자연도계열특징
shBourne Shell스티븐 본1977본 계열최초의 표준 셸, 스크립트의 기준
cshC Shell빌 조이1978C 계열C 언어 문법 차용, history·alias 도입
tcshTENEX C Shell-1983C 계열csh 개선판, 명령 완성 기능
kshKorn Shell데이비드 콘1983본 계열sh 호환 + csh 기능 통합, 연산 기능
bashBourne-Again Shell브라이언 폭스1989본 계열GNU 기본 셸, 리눅스 표준
zshZ Shell폴 포크스타드1990본 계열강력한 자동완성·플러그인, macOS 기본
dashDebian Almquist-2002본 계열가볍고 빠른 POSIX sh, 데비안 /bin/sh
  • bash는 대부분의 리눅스 배포판의 기본 로그인 셸이다. 본 셸과 호환되면서 C 셸의 편의 기능(history, alias, job control)을 흡수했다.
  • csh/tcsh는 C 언어와 유사한 문법을 쓰고, command history와 alias를 처음 도입한 셸이다.
  • ksh는 본 셸 호환성을 유지하면서 명령행 편집과 산술 연산을 강화했다.
  • zsh는 2019년부터 macOS Catalina의 기본 셸이 되어 인지도가 높아졌다.

Bash의 이름 "Bourne-Again"은 본 셸(Bourne)을 "다시 태어나게 했다(born again)"는 언어유희다. 동시에 종교적 표현 "거듭난(born-again)"과도 발음이 같아, GNU 특유의 위트가 담겨 있다.

사용 가능한 셸 확인하기

  • 시스템에 설치된 셸 목록은 /etc/shells 파일에 있다.
  • 각 사용자의 기본 로그인 셸은 /etc/passwd의 마지막 필드에 기록된다.
cat /etc/shells          # 설치된 셸 목록
echo $SHELL              # 현재 로그인 셸 경로
echo $0                  # 현재 실행 중인 셸 이름
grep "^$(whoami):" /etc/passwd   # 내 계정의 로그인 셸 확인
chsh -s /bin/zsh         # 기본 로그인 셸을 zsh로 변경 (change shell)

⚠️ 함정: $SHELL은 "로그인 시 지정된 기본 셸"을 가리키지, "지금 실행 중인 셸"이 아니다. bash로 로그인한 뒤 zsh를 직접 실행해도 $SHELL은 여전히 /bin/bash를 보여준다. 현재 실행 중인 셸은 echo $0 또는 ps -p $$로 확인해야 한다.

셸 변수 vs 환경 변수: 스코프가 모든 것을 결정한다

  • 셸 변수(local variable / shell variable): 현재 셸 안에서만 유효하다. 자식 프로세스에게 상속되지 않는다.
  • 환경 변수(environment variable): export로 표시(mark)되어 자식 프로세스에게 상속된다.
# 셸 변수 선언 — 현재 셸에서만 유효
NAME="linux"
echo $NAME            # linux
 
# 환경 변수로 승격 — 자식에게 상속됨
export NAME
 
# 또는 한 줄로 선언과 동시에 export
export PROJECT="cert"

이 차이를 직접 확인하는 것이 이해의 핵심이다.

# 직접 쳐보기: 셸 변수는 자식에게 상속되지 않는다
LOCAL_VAR="only-here"
export GLOBAL_VAR="passed-down"
 
bash                  # 자식 셸 진입
echo "$LOCAL_VAR"     # (빈 줄) — 상속 안 됨
echo "$GLOBAL_VAR"    # passed-down — 상속됨
exit                  # 부모 셸로 복귀

변수의 상속은 부모 → 자식 한 방향으로만 일어난다. 자식 셸에서 환경 변수를 바꿔도 부모 셸에는 절대 반영되지 않는다. 자식은 부모 환경의 "복사본"을 받아 시작하기 때문이다. 그래서 스크립트 안에서 export로 바꾼 변수가 스크립트를 호출한 부모 셸에 남지 않는다.

set, env, export — 변수를 다루는 세 명령

세 명령이 자주 혼동되므로 정확히 구분해야 한다.

명령보여주는 것용도
set셸 변수 + 환경 변수 + 함수 전체현재 셸의 모든 변수 출력
env환경 변수만환경 변수 출력, 임시 환경으로 명령 실행
exportexport된 변수(환경 변수)만 (export -p)셸 변수를 환경 변수로 승격
unset-변수 또는 함수 삭제
set | head             # 모든 변수(셸+환경+함수) — 가장 많이 나옴
env                    # 환경 변수만
export -p              # export된 변수 목록
unset NAME             # 변수 삭제
declare -p NAME        # 변수 속성과 값 확인 (bash 빌트인)

env는 출력만이 아니라 임시로 환경을 바꿔 명령을 실행하는 데도 쓴다.

# LANG을 영어로 임시 설정해 date 실행 (현재 셸 환경은 그대로)
env LANG=C date
 
# 환경 변수를 모두 비우고 깨끗한 환경에서 실행
env -i bash

set은 변수 출력 외에 셸 옵션을 켜고 끄는 데도 쓰인다. set -x는 실행되는 명령을 추적 출력(디버깅), set -e는 에러 발생 시 즉시 중단, set -u는 미정의 변수 사용 시 에러를 낸다. 스크립트 상단의 set -euo pipefail이 바로 이 옵션 조합으로, 안전한 스크립트의 관용구다.

주요 환경 변수

변수의미
PATH명령 실행 파일을 검색할 디렉터리 목록(:로 구분)
HOME사용자 홈 디렉터리
PWD현재 작업 디렉터리
SHELL로그인 기본 셸 경로
USER / LOGNAME로그인 사용자 이름
LANG언어·로케일 설정
PS1기본 프롬프트 문자열
TERM터미널 종류
HISTSIZE메모리에 저장할 history 개수
MAIL메일함 경로
echo $PATH
# /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin
 
# PATH에 디렉터리 추가 (앞에 붙이면 우선 검색됨)
export PATH=/opt/myapp/bin:$PATH

⚠️ 함정: PATH를 설정할 때 기존 값을 덮어쓰지 말아야 한다. export PATH=/opt/bin처럼 쓰면 ls, cat 같은 기본 명령조차 찾지 못하게 된다. 반드시 export PATH=/opt/bin:$PATH처럼 기존 $PATH를 포함시켜야 한다. 또한 PATH는 앞에서부터 검색하므로, 같은 이름의 명령이 여러 곳에 있으면 먼저 나오는 디렉터리의 것이 실행된다.

셸 초기화 파일: 누가, 언제, 어떤 순서로 읽히는가

bash가 시작될 때 어떤 설정 파일을 읽는지는 (1) 로그인 셸인지 (2) 대화형인지에 따라 달라진다. 1급 시험 범위에 든다.

전역 설정 vs 사용자 설정

  • 전역(시스템 전체): /etc/profile, /etc/profile.d/*.sh, /etc/bashrc(또는 /etc/bash.bashrc) — 모든 사용자에게 적용. 관리자(root)만 수정 가능.
  • 사용자(개인): ~/.bash_profile, ~/.bash_login, ~/.profile, ~/.bashrc, ~/.bash_logout — 각 사용자의 홈 디렉터리에 위치.

로그인 셸의 읽기 순서

로그인 셸(콘솔 로그인, SSH 접속 등)은 다음 순서로 읽는다.

1. /etc/profile          (전역 — 모든 사용자)
     └─ /etc/profile.d/*.sh  (전역 설정 모음)
2. 사용자 홈에서 다음 중 "처음 발견되는 하나"만 실행:
     ~/.bash_profile  →  ~/.bash_login  →  ~/.profile
3. 로그아웃 시: ~/.bash_logout
  • 핵심은 2단계에서 세 파일을 다 읽는 게 아니라 처음 존재하는 하나만 읽는다는 점이다.
  • 그래서 대부분의 배포판은 ~/.bash_profile 안에서 ~/.bashrc를 명시적으로 불러오도록 작성해 둔다.
# ~/.bash_profile 의 전형적인 내용
if [ -f ~/.bashrc ]; then
    . ~/.bashrc          # .bashrc를 불러옴 ( . 은 source의 줄임)
fi

비로그인 대화형 셸의 읽기 순서

터미널 에뮬레이터에서 새 탭을 여는 것처럼 로그인을 거치지 않는 대화형 셸은 다음만 읽는다.

1. /etc/bashrc  (또는 /etc/bash.bashrc, 전역)
2. ~/.bashrc    (사용자)

정리하면 — .bash_profile은 로그인할 때 한 번, .bashrc는 셸을 새로 띄울 때마다 읽힌다. 그래서 alias나 함수처럼 "모든 셸에서 매번 필요한 설정"은 .bashrc에, 환경 변수처럼 "로그인 시 한 번 설정하면 자식에게 상속되는 설정"은 .bash_profile에 두는 것이 관례다.

파일범위실행 시점
/etc/profile전역로그인 셸 시작 시 (전체 사용자)
/etc/bashrc전역대화형 셸 시작 시 (전체 사용자)
~/.bash_profile개인로그인 셸 시작 시
~/.bashrc개인대화형 셸 시작 시
~/.bash_logout개인로그아웃 시
~/.profile개인.bash_profile 없을 때 대체 (sh 호환)

~/.profile은 본래 bash 전용이 아니라 본 셸 호환 파일이다. 데비안/우분투는 전통적으로 ~/.bash_profile 대신 ~/.profile을 기본 제공한다. bash는 .bash_profile을 먼저 찾고 없으면 .bash_login, 그것도 없으면 .profile을 읽으므로, 우분투에서는 .profile이 실질적인 로그인 스크립트가 된다.

설정 변경을 즉시 적용하기: source

설정 파일을 수정한 뒤 로그아웃·재로그인하지 않고 즉시 반영하려면 source 또는 .(점)을 쓴다.

source ~/.bashrc       # 현재 셸에 .bashrc 내용을 다시 읽어들임
. ~/.bashrc            # 위와 완전히 동일 ( . 은 source의 단축)

bash ~/.bashrc처럼 실행하면 안 된다. 이는 새 자식 셸을 띄워 그 안에서만 적용한 뒤 끝나버리므로 현재 셸에는 아무 변화가 없다. 반드시 source(또는 .)를 써서 현재 셸 프로세스 안에서 파일을 읽어야 변경이 유지된다. 이것이 바로 셸 변수 상속(부모↔자식)과 직결되는 개념이다.

source 명령은 원래 C 셸에서 처음 등장했고, 본 셸 계열에서는 .(점) 하나로 같은 일을 했다. bash는 두 표기를 모두 지원한다. 시험에서 ". file과 같은 역할을 하는 명령은?"이라는 문제가 나오면 답은 source다.

내일은 이 토대 위에서 리다이렉션과 파이프를 다룬다.

📖 용어

  • 셸(shell) : 사용자가 친 명령을 해석해 커널에 전달하는 프로그램. 커널을 감싼 "껍데기"라 이 이름이다.
  • REPL : 읽고(Read)·해석하고(Eval)·출력하고(Print) 다시 반복(Loop)하는 셸의 기본 사이클.
  • 대화형 / 비대화형 셸 : 터미널에서 직접 타이핑하는 셸과 스크립트를 실행하는 셸. 읽는 설정 파일이 다르다.
  • 로그인 셸 : 콘솔 로그인이나 SSH 접속으로 시작된 셸. /etc/profile과 ~/.bash_profile을 읽는다.
  • 셸 변수 : 현재 셸에서만 사는 변수. 자식 프로세스로 넘어가지 않는다.
  • 환경 변수 : export로 표시해 자식 프로세스에 상속되는 변수. 단, 부모로는 절대 거슬러 올라가지 않는다.
  • export : 셸 변수를 환경 변수로 승격시키는 명령.
  • set vs env : set은 셸 변수·환경 변수·함수를 전부, env는 환경 변수만 보여준다.
  • PATH : 명령 실행 파일을 찾을 디렉터리 목록. 앞에서부터 검색하며 덮어쓰면 기본 명령도 못 찾는다.
  • PS1 : 프롬프트 모양을 결정하는 환경 변수.
  • ~/.bash_profile vs ~/.bashrc : 전자는 로그인할 때 한 번, 후자는 셸을 새로 띄울 때마다 읽힌다.
  • source(.) : 파일을 현재 셸 안에서 읽어 설정을 즉시 반영하는 명령. bash 파일과는 결과가 다르다.

📝 연습 문제

선택지를 클릭하면 정답·해설이 펼쳐집니다.

문제 1

다음 중 셸의 계열 분류가 잘못 짝지어진 것은?

문제 2

셸 변수 VAR를 자식 프로세스에게 상속되도록 환경 변수로 만드는 명령으로 옳은 것은?

문제 3

로그인 셸이 가장 먼저 읽는 전역 설정 파일은?

문제 4

현재 셸에 설정된 환경 변수만 출력하는 명령은?

문제 5

.bashrc 파일을 수정한 뒤 로그아웃 없이 현재 셸에 즉시 반영하는 올바른 방법은?

문제 6

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

문제 7

비로그인 대화형 셸(터미널에서 새 탭 열기)이 읽는 사용자 설정 파일은?

이전Week 2 종합 복습: 명령행에서 살아남기 위한 모든 것Week 2 · Day 5다음 흐름을 잇고 비트는 기술: 리다이렉션, 파이프, 메타문자Week 3 · Day 2

참고 공식 자료

  • 리눅스마스터 1급 공식 출제 기준(새 탭에서 열림)

이 페이지

  • 셸이란 무엇인가: 커널과 사용자 사이의 통역사
  • 셸의 종류와 특징: sh, csh, ksh, bash, zsh
  • 사용 가능한 셸 확인하기
  • 셸 변수 vs 환경 변수: 스코프가 모든 것을 결정한다
  • set, env, export — 변수를 다루는 세 명령
  • 주요 환경 변수
  • 셸 초기화 파일: 누가, 언제, 어떤 순서로 읽히는가
  • 전역 설정 vs 사용자 설정
  • 로그인 셸의 읽기 순서
  • 비로그인 대화형 셸의 읽기 순서
  • 설정 변경을 즉시 적용하기: source
  • 용어
  • 연습 문제