🖥️ 터미널 완전 정복 치트시트 (프론트 개발자를 위한 20개 명령어)
왜 터미널이 필요한가
터미널은 컴퓨터에게 말로 시키는 창구입니다. 마우스가 "메뉴에서 골라 클릭"이라면, 터미널은 "이거 해"라고 문장으로 말하는 것이에요.
프론트만 하던 사람은 npm run dev 정도만 치고 살았을 겁니다. 그런데 AWS 서버(EC2)에 접속하면 화면이 없습니다. 마우스도 없어요. 검은 화면에 글자뿐입니다. 거기서 파일을 옮기고 프로그램을 띄우고 로그를 봐야 합니다.
개념부터 잡기
폴더 구조와 "현재 위치"
터미널에는 항상 "지금 내가 서 있는 폴더"가 있습니다. 이걸 현재 작업 디렉터리(cwd) 라고 불러요.
/ ← 루트. 모든 것의 꼭대기
├── Users/
│ └── me/ ← 홈 디렉터리. 줄여서 ~
│ └── Desktop/
│ └── study/
│ └── my-board/ ← 여기에 서 있다면
│ ├── web/ ← cd web (상대 경로)
│ └── server/ ← cd ./server (같은 뜻)
└── etc/
절대 경로 vs 상대 경로
| 종류 | 예시 | 뜻 |
|---|---|---|
| 절대 경로 | /Users/me/Desktop/study | / 부터 시작. 어디서 치든 같은 곳 |
| 홈 기준 | ~/Desktop/.../study | ~ = 내 홈 폴더. 절대 경로와 사실상 같음 |
| 상대 경로 | web/src | 지금 서 있는 곳 기준 |
| 부모 폴더 | .. | 한 칸 위 |
| 현재 폴더 | . | 지금 여기 |
cd ../server 는 "한 칸 위로 갔다가 server 로 들어가"라는 뜻입니다.
명령어 한 줄의 구조
ls -al ~/Desktop
│ │ │
명령 옵션 대상(인자)
옵션은 - 하나에 한 글자(-a), -- 두 개에 단어(--help) 형태입니다. -al 은 -a -l 을 붙여 쓴 것이에요.
직접 따라해 보기
1단계. 위치 파악과 이동
pwd # 지금 어디 있나 (print working directory)
cd ~ # 홈으로
cd ~/Desktop/study
pwd
cd .. # 한 칸 위
cd - # 직전에 있던 곳으로 되돌아가기
cd 만 치고 Enter 해도 홈으로 갑니다.
2단계. 목록 보기
ls # 이름만
ls -l # 자세히 (권한·크기·수정일)
ls -a # 숨김 파일(.env, .gitignore)까지
ls -al # 둘 다. 제일 많이 쓴다
ls -lh # 크기를 1.2K, 3.4M 처럼 읽기 좋게
.env 나 .gitignore 는 ls 만 치면 안 보입니다. 점(.)으로 시작하는 파일은 숨김 처리라서 -a 옵션이 필요해요. 이걸 모르면 나중에 ".env 를 만들었는데 없어졌다"며 헤매게 됩니다.
3단계. 만들기
cd ~/Desktop/study
mkdir 연습 # 폴더 하나
mkdir -p 연습/a/b/c # 중간 폴더까지 한 번에 (-p = parents)
cd 연습
touch memo.txt # 빈 파일 만들기
ls -al
4단계. 파일에 글 쓰고 읽기
echo "첫 줄이다" > memo.txt # > : 덮어쓰기
echo "둘째 줄이다" >> memo.txt # >> : 이어붙이기
cat memo.txt # 전체를 한 번에 출력
첫 줄이다
둘째 줄이다
> 와 >> 의 차이는 반드시 몸에 익혀야 합니다. > 는 기존 내용을 전부 날립니다. 서버 로그 파일에 > 를 잘못 쓰면 로그가 통째로 사라져요.
파일이 길면 cat 은 화면을 넘겨버립니다. 이럴 땐 less 를 쓰세요.
less memo.txt
less 안에서는:
| 키 | 동작 |
|---|---|
Space / f | 다음 화면 |
b | 이전 화면 |
/검색어 | 아래로 검색 (n 으로 다음 결과) |
G | 맨 끝으로 |
g | 맨 앞으로 |
q | 나가기 |
q 를 모르면 영영 못 나옵니다. 초보자가 제일 자주 갇히는 곳이에요. "less 에서 못 나가겠다" 싶으면 무조건 q!
5단계. 복사 · 이동 · 삭제
cp memo.txt memo-backup.txt # 복사
cp -r a a-copy # 폴더 복사는 -r (recursive)
mv memo-backup.txt 백업.txt # 이름 바꾸기
mv 백업.txt a/ # 옮기기 (대상이 폴더면 이동)
rm a/백업.txt # 파일 삭제
rm -r a-copy # 폴더 삭제
rm 에는 휴지통이 없습니다. 지우면 끝이에요. 특히 아래 두 개는 절대 치지 마세요.
rm -rf / # 컴퓨터를 날린다
rm -rf ~ # 홈 폴더를 통째로 날린다
안전하게 쓰려면 rm -i (하나씩 물어봄) 를 쓰거나, 지우기 전에 ls 로 먼저 확인하는 습관을 들이세요.
6단계. Tab 자동완성과 Ctrl 단축키
cd ~/Desk # 여기서 Tab → cd ~/Desktop/ 으로 완성됨
cat me # Tab → cat memo.txt
Tab 을 눌렀는데 아무 일도 없으면 후보가 여러 개라는 뜻입니다. Tab 을 한 번 더 누르면 후보 목록이 떠요.
| 단축키 | 동작 | 언제 쓰나 |
|---|---|---|
Tab | 자동완성 | 항상 |
Ctrl + C | 실행 중인 프로그램 강제 종료 | npm run dev 를 끌 때. 가장 많이 씀 |
Ctrl + D | 입력 끝 / 셸 종료 | node REPL 에서 나올 때 |
Ctrl + L | 화면 지우기 (clear 와 같음) | 지저분할 때 |
Ctrl + A / Ctrl + E | 줄 맨 앞 / 맨 끝으로 | 긴 명령 고칠 때 |
Ctrl + U | 커서 앞을 전부 지우기 | 잘못 친 줄 버릴 때 |
↑ / ↓ | 이전 명령 불러오기 | 항상 |
Ctrl + R | 예전 명령 검색 | ssh 처럼 긴 명령 다시 칠 때 |
7단계. 파이프 | 와 리다이렉트 >
파이프는 앞 명령의 출력을 뒤 명령의 입력으로 넘기는 관입니다.
[ls -al] ──출력──▶ | ──입력──▶ [grep .env] ──▶ 화면
ls -al | grep env # 목록 중 env 가 들어간 줄만
cat memo.txt | wc -l # 줄 수 세기
ls -al > 목록.txt # 화면 대신 파일로 저장
ls -al | grep txt > 결과.txt
wc -l 은 줄 수, wc -c 는 글자 수를 셉니다.
8단계. grep — 내용 검색
grep 은 "이 글자가 들어간 줄을 찾아줘"입니다. 서버 로그에서 에러를 찾을 때 매일 써요.
grep "둘째" memo.txt # 파일 안에서 찾기
grep -n "둘째" memo.txt # 줄 번호까지 (-n)
grep -i "DULJJAE" memo.txt # 대소문자 무시 (-i)
grep -r "PORT" ~/Desktop/.../01-basics # 폴더 전체 재귀 (-r)
실무에서는 이렇게 씁니다.
pm2 logs --lines 200 | grep -i error # 최근 로그에서 에러만
9단계. 프로세스와 포트 — 서버 공부 내내 쓴다
우리 서버는 9100 포트, 프론트는 3100 포트를 씁니다. 서버 공부를 시작하면 이런 에러를 반드시 만나요.
Error: listen EADDRINUSE: address already in use :::9100
"9100 을 이미 누가 쓰고 있다"는 뜻입니다. 범인을 찾아서 종료해야 해요.
lsof -i :9100 # 9100 포트를 쓰는 프로세스 찾기
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 54321 me 24u IPv6 0x1a2b3 0t0 TCP *:9100 (LISTEN)
PID(프로세스 번호) 54321 이 범인입니다.
kill 54321 # 정중하게 종료 요청 (권장)
kill -9 54321 # 말을 안 들으면 강제 종료
한 줄로 끝내려면:
lsof -ti :9100 | xargs kill -9
-t 는 PID 만 출력하는 옵션이고, xargs 는 그 값을 뒤 명령의 인자로 넘깁니다.
현재 돌고 있는 프로세스를 보는 명령도 알아두세요.
ps aux | grep node # node 로 돌고 있는 것들
ps aux | grep -v grep | grep node # grep 자기 자신은 빼고
| 명령 | 한 줄 요약 |
|---|---|
lsof -i :9100 | 9100 포트를 점유한 프로세스 찾기 |
ps aux | grep node | 실행 중인 node 프로세스 목록 |
kill PID | 정상 종료 요청 |
kill -9 PID | 강제 종료 (최후의 수단) |
Ctrl + C | 지금 터미널에서 돌고 있는 것을 끄기 |
10단계. ssh 맛보기
ssh 는 다른 컴퓨터의 터미널을 내 터미널에서 쓰는 것입니다. AWS EC2 에 접속할 땐 이렇게 생겼어요.
ssh -i ~/.ssh/my-board-key.pem ubuntu@3.36.12.34
| 조각 | 뜻 |
|---|---|
-i ~/.ssh/....pem | 열쇠 파일(비밀키). AWS 가 EC2 만들 때 준다 |
ubuntu | 접속할 계정 이름 (Ubuntu 의 기본 계정) |
3.36.12.34 | 서버의 공인 IP |
접속하면 프롬프트가 me@맥북 % 에서 ubuntu@ip-172-31-x-x:~$ 로 바뀝니다. 이때부터 치는 명령은 전부 AWS 컴퓨터에서 실행돼요. 나올 때는 exit.
✅ 확인 — 이렇게 나오면 성공
아래를 순서대로 치고 마지막 출력이 일치하면 성공입니다.
cd ~/Desktop/study
mkdir -p 연습/로그
cd 연습
printf 'INFO 시작\nERROR DB 연결 실패\nINFO 종료\n' > 로그/app.log
grep -n ERROR 로그/app.log
cat 로그/app.log | wc -l
2:ERROR DB 연결 실패
3
포트 확인도 해봅니다. 아무것도 안 띄운 상태라면 결과가 비어 있는 게 정상이에요.
lsof -i :9100
echo "종료코드: $?"
종료코드: 1
($? 는 직전 명령의 종료 코드입니다. 0 이면 성공, 0 이 아니면 실패/결과 없음.)
🔧 흔한 에러 해결
| 증상 | 원인 | 해결 |
|---|---|---|
zsh: no such file or directory: web | 지금 폴더에 web 이 없음 | pwd 로 위치 확인 → ls 로 이름 확인 → Tab 자동완성 |
less 를 열었는데 못 나감 | 종료 키를 모름 | q 를 누른다 |
rm 으로 지웠는데 복구하고 싶다 | rm 에는 휴지통이 없음 | 복구 불가. 앞으로 ls 로 먼저 확인하거나 rm -i 사용 |
EADDRINUSE ... :::9100 | 이전 서버가 안 죽고 남음 | lsof -ti :9100 | xargs kill -9 후 재실행 |
permission denied: ./deploy.sh | 실행 권한이 없음 | chmod +x deploy.sh 후 재실행 |
ls 했는데 .env 가 안 보임 | 점으로 시작하면 숨김 | ls -a 또는 ls -al |
| 한글 폴더에서 Tab 이 이상하게 완성됨 | 맥의 유니코드 정규화 | 따옴표로 감싼다: cd "연습" |
> 로 썼더니 기존 내용이 날아감 | > 는 덮어쓰기 | 이어붙이려면 >>. 복구는 불가 |
npm run dev 터미널에서 다른 명령이 안 먹힘 | 그 터미널은 서버가 점유 중 | 새 탭(Command + T) 또는 Ctrl + C 로 서버 끄기 |
📝 과제
과제 1. 연습 문제 10개 (전부 터미널로)
~/Desktop/study/연습 폴더 안에서 풉니다. 답은 직접 명령을 만들어 내세요.
- 지금 서 있는 폴더의 절대 경로를 출력하라.
연습안에drill/a/b폴더를 한 줄 명령으로 만들어라.drill/a/b안에hello.txt를 만들고hello world를 써 넣어라 (touch없이 한 줄로).hello.txt에second line을 기존 내용을 지우지 않고 추가하라.hello.txt를drill/a로 복사하고, 원본은greeting.txt로 이름을 바꿔라.연습아래에서line이 들어간 파일을 줄 번호와 함께 전부 찾아라 (재귀).연습의 파일 목록을목록.txt로 저장하되, 숨김 파일도 포함하라.목록.txt가 몇 줄인지 파이프를 써서 세어라.- 지금 내 맥에서 3100 포트를 쓰는 프로세스가 있는지 확인하고, 있으면 PID 를 찾아 종료하라.
drill폴더를 통째로 삭제하라. 단, 삭제 전에ls -R drill로 먼저 확인하라.
~/.zsh_history 에 남습니다. 확인은 history | tail -30.
과제 2. 포트 점유 상황을 일부러 만들고 해결하기
터미널 A 에서 아래를 실행해 9100 을 점유시킵니다.
node -e "require('http').createServer((q,s)=>s.end('hi')).listen(9100, ()=>console.log('9100 점유중'))"
터미널 B(Command + T)에서 같은 명령을 다시 실행해 EADDRINUSE 를 직접 봅니다. 그다음 터미널 B 에서 lsof -i :9100 으로 PID 를 찾아 kill 로 종료하세요.
과제 3. 나만의 alias 3개 만들기
~/.zshrc 에 자주 쓸 단축어 3개를 추가합니다. 예: alias p9='lsof -i :9100'.
source ~/.zshrc 후 새로 만든 단축어 3개가 전부 동작한다.
🎯 요약 (3줄)
pwd(어디) →ls -al(뭐가 있나) →cd(이동) 세 개가 터미널의 90%입니다. 나머지는 Tab 과↑로 칩니다.|는 앞 출력을 뒤로 넘기는 관,>는 덮어쓰기,>>는 이어쓰기입니다.grep과 조합하면 로그에서 에러만 뽑아냅니다.- 서버 공부 중
EADDRINUSE가 뜨면lsof -i :9100으로 범인을 찾고kill로 끝냅니다. 이 한 세트를 계속 씁니다.






























