[TIL] Missing Semester #1: Shell 기초

2026. 04. 10.Yeji Kim
missing-semester

Claude와 함께 MIT Missing Semester 강의를 실습하며 정리한 내용입니다.

들어가며

Missing Semester 첫 강의는 쉘의 기초부터 데이터 처리 파이프라인까지를 다룬다.

핵심 개념

터미널 vs 쉘

  • 터미널 - 화면을 보여주는 앱 (창)
  • - 명령어를 해석하는 프로그램 (엔진)

대표 쉘: bash(Linux 기본), zsh(macOS 기본), fish

변수와 $

$는 변수의 값을 읽는 기호다.

bash
name="yeji"
echo name    # 문자열 "name" 출력
echo $name   # 변수 값 "yeji" 출력

$SHELL, $PATH, $HOME 같은 환경변수는 쉘이 미리 정의해둔 것.

경로 탐색

  • pwd - 현재 위치
  • cd - 이동
  • ls - 파일 목록
  • ~ - 홈 디렉토리, .. - 상위 디렉토리

ls -l의 각 컬럼: 권한 / 링크 수 / 소유자 / 그룹 / 크기 / 수정일 / 파일명

권한은 rwx 세 묶음: 소유자 / 그룹 / 기타. r=읽기, w=쓰기, x=실행.

빌트인 vs 외부 프로그램

쉘에서 실행하는 명령어는 세 종류다:

  • 쉘 빌트인 - 쉘 안에 내장 (cd, export, alias)
  • OS 기본 도구 - OS가 미리 설치 (/bin/ls, /usr/bin/grep)
  • 사용자 설치 - 직접 설치 (node, docker, jq)

cd가 빌트인인 이유: 외부 프로그램은 자식 프로세스에서 실행되는데, 자식이 디렉토리를 바꿔봤자 부모(쉘)에는 영향이 없다. 사무실을 옮기려면 사무실 주인이 직접 해야 하는 것과 같다.

bash
type cd      # builtin
type ls      # /bin/ls (외부 프로그램)
which grep   # /usr/bin/grep

$PATH와 프로그램 탐색

쉘이 프로그램을 찾는 디렉토리 목록. which로 실제 위치 확인 가능.

스트림과 리다이렉션

모든 프로그램에는 stdin(입력), stdout(출력), stderr(에러) 세 스트림이 있다.

  • > - stdout을 파일로 (덮어쓰기)
  • >> - stdout을 파일로 (추가)
  • 2> - stderr를 파일로
  • 2>/dev/null - 에러 버리기
  • | - 파이프. 앞 프로그램의 stdout을 뒤 프로그램의 stdin으로 연결

종료 코드와 조건부 실행

  • $? - 직전 명령어의 종료 코드 (0=성공)
  • && - 앞이 성공하면 뒤 실행
  • || - 앞이 실패하면 뒤 실행

글로브

  • * - 모든 문자열
  • ? - 한 글자
  • {a,b,c} - 중괄호 확장

쿼팅

  • '...' - 변수 해석 안 함 (그대로 출력)
  • "..." - 변수 해석함
  • $'...' - 이스케이프 시퀀스(\n, \t) 인식

데이터 처리 도구

도구역할
grep패턴 검색
sed스트림 편집 (치환)
awk컬럼 기반 처리
sort정렬
uniq -c중복 세기 (정렬 필수)
head/tail앞/뒤 N줄
wc -l줄 수 세기
find파일 찾기
xargsstdin을 인자로 변환
curlHTTP 요청
jqJSON 처리

커맨드 치환

$(...) 안의 명령어 결과를 값으로 사용:

bash
echo "오늘은 $(date +%Y-%m-%d)"

실습 기록

파이프라인으로 확장자 빈도 분석

bash
find . -type f | sed 's/.*\.//' | sort | uniq -c | sort -rn | head -5

각 단계가 하나의 도구, 파이프로 연결 — Unix 철학의 핵심.

블로그 태그 빈도 분석

bash
grep -h "  - " content/til/*.mdx | sed 's/  - //' | sort | uniq -c | sort -rn

블로그에서 어떤 태그를 가장 많이 쓰는지 한 줄로 확인 가능.

flaky 테스트 반복 실행

bash
while ! /tmp/flaky.sh; do echo "재시도..."; done

while !로 실패하는 동안 반복 — 종료 코드와 제어 흐름의 조합.


레퍼런스