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나 .gitconfig를 cat으로 열어봤던 것이 바로 이 명령입니다.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 자동완성과
↑히스토리로 빠르게
✍️ 확인 문제
- 현재 위치를 확인하고 숨김 파일까지 보는 명령은?
>와>>의 차이는?- 셸에서 파일 이름을 바꾸려면 어떤 명령을 쓰나요?
다음 장에서는 협업의 꽃인 Pull Request를 처음부터 끝까지 깊이 다룹니다. → 16_PullRequest심화.md