15. 셸 명령어 기초 — 터미널 다루기

🎯 이 장의 목표
  • 터미널/셸이 무엇인지 이해한다
  • 디렉터리를 이동·생성·삭제한다
  • 파일을 만들고·복사·이동·삭제하고 내용을 본다
  • Git 작업에 꼭 필요한 셸 명령을 손에 익힌다
💡 팁
Git은 대부분 터미널에서 사용하므로, 기본 셸 명령을 알면 작업이 훨씬 수월합니다. 이미 터미널에 익숙하다면 이 장은 건너뛰어도 됩니다.

15.1 셸과 터미널이란?

  • 터미널(Terminal): 명령어를 입력하는 창 (Git Bash, iTerm2, macOS 터미널 등)
  • 셸(Shell): 입력한 명령을 해석해 실행하는 프로그램 (bash, zsh 등)

비유하자면 터미널은 "대화창", 셸은 "대화 상대"입니다. 명령을 타이핑하면 셸이 알아듣고 실행합니다.

💡 팁
운영체제별 환경
  • macOS/Linux: 기본 터미널에서 bash 또는 zsh 사용
  • Windows: Git 설치 시 함께 깔리는 Git Bash를 쓰면 macOS/Linux와 동일한 명령 사용 가능 (이 책 권장)
  • macOS 사용자는 더 편한 터미널인 iTerm2와 강력한 셸인 zsh를 설치하기도 합니다.

15.2 현재 위치 확인과 둘러보기

BASH
pwd               # print working directory: 현재 위치(경로) 출력
ls                # list: 현재 폴더의 파일/폴더 목록
ls -l             # 자세히 (권한, 크기, 수정일)
ls -a             # 숨김 파일까지 (.git, .gitignore 등)
ls -la            # 둘 다
BASH
pwd
CODE
/home/user/projects
📌 핵심
.으로 시작하는 파일/폴더는 숨김 처리됩니다(.git, .gitignore, .env). ls -a를 써야 보입니다.

15.3 디렉터리(폴더) 관리

이동 — cd (change directory)

BASH
cd projects           # projects 폴더로 이동
cd projects/myapp     # 하위 경로로 한 번에
cd ..                 # 한 단계 상위로
cd ../..              # 두 단계 상위로
cd ~                  # 홈 디렉터리로
cd /                  # 루트로
cd -                  # 직전 위치로 (git switch - 와 비슷)
💡 팁
절대 경로 vs 상대 경로
  • 절대 경로: /home/user/projects (루트부터 전체 경로)
  • 상대 경로: projects/myapp (현재 위치 기준)

생성 — mkdir (make directory)

BASH
mkdir myproject              # 폴더 하나 생성
mkdir -p a/b/c               # 중첩 폴더를 한 번에 (-p: 부모도 함께)

삭제 — rmdir / rm -r

BASH
rmdir empty-folder           # 빈 폴더만 삭제
rm -r myfolder               # 폴더와 그 안의 모든 것 삭제 (-r: 재귀)
⚠️ 흔한 실수
rm -r휴지통 없이 즉시 영구 삭제합니다. 특히 rm -rf는 강력하니 경로를 반드시 확인하세요. (7장의 git clean처럼 되돌릴 수 없습니다.)

15.4 파일 관리

빈 파일 생성 — touch

BASH
touch readme.txt             # 빈 파일 생성 (이미 있으면 수정시각만 갱신)
touch a.txt b.txt c.txt      # 여러 개 한 번에

내용을 넣어 파일 만들기 — echo + 리다이렉트

BASH
echo "Hello" > greeting.txt    # > : 덮어쓰기 (기존 내용 삭제)
echo "World" >> greeting.txt   # >> : 이어쓰기 (기존 내용 뒤에 추가)
기호의미
>출력을 파일에 덮어쓰기
>>출력을 파일에 이어붙이기
`\`

복사 — cp (copy)

BASH
cp a.txt b.txt               # a.txt를 b.txt로 복사
cp a.txt backup/             # backup 폴더 안으로 복사
cp -r folder1 folder2        # 폴더 통째로 복사 (-r)

이동·이름 변경 — mv (move)

BASH
mv old.txt new.txt           # 이름 변경
mv file.txt archive/         # archive 폴더로 이동
mv file.txt archive/done.txt # 이동하면서 이름도 변경
💡 팁
셸에는 "이름 변경" 전용 명령이 따로 없습니다. 이동(mv)이 곧 이름 변경입니다.

삭제 — rm (remove)

BASH
rm file.txt                  # 파일 삭제
rm *.log                     # .log로 끝나는 모든 파일 삭제
rm -i file.txt               # 삭제 전 확인 묻기 (-i: interactive)

15.5 파일 내용 보기

BASH
cat file.txt                 # 파일 전체 내용 출력
cat a.txt b.txt              # 여러 파일 이어서 출력
head file.txt                # 앞 10줄
head -n 5 file.txt           # 앞 5줄
tail file.txt                # 뒤 10줄
tail -n 5 file.txt           # 뒤 5줄
tail -f log.txt              # 실시간으로 추가되는 내용 따라가기 (로그 볼 때)
less file.txt                # 페이지 단위로 보기 (q로 종료)
💡 팁
14장에서 .git/HEAD.gitconfigcat으로 열어봤던 것이 바로 이 명령입니다.

15.6 검색과 와일드카드

와일드카드(글로빙)

BASH
ls *.txt              # .txt로 끝나는 모든 파일
ls test*              # test로 시작하는 모든 것
ls ??.txt             # 두 글자 + .txt (a1.txt, b2.txt 등)
패턴의미
*임의의 글자 0개 이상
?임의의 한 글자
[abc]a, b, c 중 하나

이 패턴들은 3장의 .gitignore 규칙과 동일한 원리입니다.

내용 검색 — grep

BASH
grep "TODO" file.txt          # 파일에서 TODO가 든 줄 찾기
grep -r "TODO" .              # 현재 폴더 전체에서 재귀 검색 (-r)
grep -n "TODO" file.txt       # 줄 번호와 함께 (-n)
grep -i "todo" file.txt       # 대소문자 무시 (-i)

파일 찾기 — find

BASH
find . -name "*.js"           # 현재 폴더 이하의 모든 .js 파일
find . -type d -name "test"   # test라는 이름의 디렉터리

14장에서 find .git/objects -type f로 객체 파일을 찾았던 것이 이 명령입니다.

15.7 알아두면 편한 단축키와 팁

단축키/명령효과
Tab자동 완성 (파일·폴더 이름)
/ 이전/다음 명령 불러오기
Ctrl + C실행 중인 명령 중단
Ctrl + L (또는 clear)화면 지우기
Ctrl + A / Ctrl + E줄 맨 앞 / 맨 끝으로 커서 이동
history입력했던 명령 기록 보기
💡 팁
Tab 자동완성은 생산성의 핵심입니다. 긴 파일명을 다 칠 필요 없이 앞 몇 글자 + Tab이면 됩니다. 오타도 줄어듭니다.

15.8 실습: 셸만으로 미니 프로젝트 구조 만들기

BASH
# 1. 프로젝트 폴더 생성 후 이동
mkdir -p myapp/src myapp/tests
cd myapp

# 2. 파일 생성
touch src/index.js tests/index.test.js
echo "# My App" > README.md

# 3. 구조 확인
ls -la
ls -la src

# 4. 내용 추가 후 확인
echo "console.log('hello');" > src/index.js
cat src/index.js

# 5. 이제 Git 시작 (앞 장들의 흐름과 연결)
git init
git add .
git status

셸 명령으로 만든 구조 위에 바로 Git을 얹는 흐름입니다. 이 둘은 늘 함께 쓰입니다.

15.9 이 장에서 배운 것 (요약)

  • 터미널(창)에서 (bash/zsh)이 명령을 실행한다
  • 위치: pwd(현재 위치), ls(목록, -la로 숨김+상세), cd(이동)
  • 폴더: mkdir -p(생성), rm -r(삭제, 주의)
  • 파일: touch(생성), cp(복사), mv(이동/이름변경), rm(삭제)
  • 내용: cat/head/tail/less, 검색은 grep·find
  • >(덮어쓰기) / >>(이어쓰기) / |(파이프)
  • Tab 자동완성 히스토리로 빠르게

✍️ 확인 문제

  1. 현재 위치를 확인하고 숨김 파일까지 보는 명령은?
  2. >>>의 차이는?
  3. 셸에서 파일 이름을 바꾸려면 어떤 명령을 쓰나요?
다음 장에서는 협업의 꽃인 Pull Request를 처음부터 끝까지 깊이 다룹니다. → 16_PullRequest심화.md