우분투 · 리눅스 입문 — 12편 (기초)

리눅스 파이프와 리다이렉션 — | > >> 2>

리눅스가 "작은 도구를 조립해 큰 일을 한다"고 했죠. 그 조립을 가능하게 하는 게 이 기호 몇 개입니다 — 이걸 알면 명령줄이 갑자기 강력해져요.

2026년 5월 12일 · 약 8분 · 26편 입문 시리즈 12편

터미널에서 명령어를 파이프와 리다이렉션으로 연결한 화면 — 리눅스 파이프와 리다이렉션을 상징하는 일러스트

7편에서 sort fruits.txt | uniq -c 한 줄로 "과일별 개수"가 나오는 걸 봤죠. "작은 도구를 파이프로 조립한다" — 그게 리눅스의 철학이라고도 했고요. 이번 편은 그 조립 기호들을 제대로 정리합니다: 파이프 |, 리다이렉션 >·>>·<, 그리고 에러를 따로 다루는 2>·2>&1·/dev/null.

먼저 머릿속에 그림 하나 — 모든 명령에는 입구 하나, 출구 둘이 있습니다. 들어오는 곳(stdin), 정상 결과가 나가는 곳(stdout), 에러 메시지가 나가는 곳(stderr). 평소엔 stdin=키보드, stdout·stderr=화면. 리다이렉션과 파이프는 그 입구·출구를 다른 데로 돌리는 장치예요 — 출구를 파일로(>), 또는 다음 명령의 입구로(|). 26편 입문 시리즈 12편, 여기까지가 "기초" 묶음입니다.

준비물 — 우분투 + 터미널. 6편(파일 명령어)·7편(텍스트 명령어 — 파이프 맛보기)을 봤다면 바로 이어집니다. 6편에서 만든 ~/linux-practice에서 실습하세요. 다 안전한 명령입니다.

입구 하나, 출구 둘 — stdin · stdout · stderr

리눅스에서 모든 명령은 이 세 개의 "통로"를 가집니다. 번호가 붙어 있어요 — 이 번호가 나중에 2> 같은 데서 쓰입니다.

통로 (번호)뭔가 / 평소 연결 대상
stdin (0)표준 입력 — 명령이 데이터를 받는 곳. 평소엔 키보드. 파이프 |로 앞 명령의 출력을 여기로 흘려보냄.
stdout (1)표준 출력 — 명령의 정상 결과가 나가는 곳. 평소엔 화면. >·>>로 파일에 담을 수 있음.
stderr (2)표준 에러 — 에러·경고 메시지만 따로 나가는 곳. 평소엔 화면(그래서 stdout과 섞여 보임). 2>로 따로 뺄 수 있음.

왜 정상 결과(1)와 에러(2)를 따로 둘까요? — 그래야 "결과만 파일에 저장하고, 에러는 화면에서 따로 보기" 같은 게 됩니다. 평소 화면에선 둘이 섞여 나와서 구분이 안 가지만, 리다이렉션을 쓰면 각각 다른 데로 보낼 수 있어요. 이게 핵심 아이디어입니다.

리다이렉션 — > · >> · <

"출구(또는 입구)를 화면/키보드 대신 파일로." 세 가지면 충분합니다.

$ ls ~ > home-list.txt ← ls 의 결과(stdout)를 화면이 아니라 home-list.txt 에 저장. 파일 있으면 덮어씀 $ echo "추가 줄" >> home-list.txt ← >> 는 '이어쓰기'. 파일 끝에 덧붙임 (덮어쓰기 X). 로그 모을 때 자주 $ cat home-list.txt ← 잘 담겼는지 확인 (7편의 cat) $ sort < fruits.txt ← < 는 '파일을 입력(stdin)으로'. = sort fruits.txt 와 결과 같음 (보통 인자를 쓰지만, 이런 형태도 있다는 것만)
⚠️ > 는 묻지 않고 덮어씁니다 — 되돌리기 없음. 중요한 파일 이름으로 명령 > 중요파일.txt 하면 그 파일 내용이 그 명령의 출력으로 통째로 바뀝니다. 이어 붙이고 싶을 땐 반드시 >>. 그리고 cat a > a 처럼 같은 파일을 입력이자 출력으로 쓰면 내용이 날아가요 — 하지 마세요.

에러 따로 다루기 — 2> · 2>&1 · /dev/null

여기가 처음 보면 헷갈리는데, 패턴 몇 개만 외우면 됩니다.

$ ls ~ /없는폴더 > out.txt 2> err.txt ← 정상결과는 out.txt 로(1=stdout), 에러는 err.txt 로(2=stderr) — 따로따로 $ 명령 > all.txt 2>&1 ← 2>&1 = "에러(2)도 출력(1)이 가는 데로 합쳐라" → 정상+에러 전부 all.txt 에. 순서 중요: > 먼저, 2>&1 뒤 $ 명령 &> all.txt ← 위와 같은 뜻의 짧은 표기 (bash). "stdout+stderr 둘 다 all.txt 로" $ 시끄러운명령 2> /dev/null ← /dev/null = '리눅스의 블랙홀'. 에러 메시지를 그냥 버림(안 보고 싶을 때) $ 명령 > /dev/null 2>&1 ← 정상결과도 에러도 전부 버림 ("아무것도 출력하지 마"). cron 스크립트에서 자주 봄

제일 많이 쓰는 둘만 기억하세요 — 2> /dev/null("에러는 조용히 무시") 과 > 파일 2>&1("정상+에러 전부 이 파일에 로그"). 나머지는 필요할 때 위 표 보고 조합하면 됩니다. (참고로 cron 작업 줄 끝에 흔히 붙는 >/dev/null 2>&1이 바로 "이 작업은 출력 메일 보내지 마"라는 뜻이에요 — 시리즈 20편 cron에서 다시.)

파이프 | — 명령 조립의 핵심

리다이렉션이 "출구를 파일로"라면, 파이프 |"앞 명령의 출구(stdout)를 뒤 명령의 입구(stdin)로 직접 연결"입니다. 파일을 거치지 않고 바로 흘려보내는 거죠. 7편에서 맛봤지만 이제 본격적으로.

$ ls /usr/bin | wc -l ← /usr/bin 의 항목을 → wc -l 로 셈. "설치된 명령어가 몇 개나 되나" $ cat /var/log/syslog | grep -i error | tail -20 ← 로그를 → 'error' 든 줄만 골라 → 마지막 20줄. 트러블슈팅 단골 조합 $ apt list --installed | grep python | wc -l ← 설치된 패키지 → python 들어간 것만 → 개수. 11편 apt + 7편 grep + 파이프 $ ps aux | grep firefox ← 실행 중인 프로세스 목록 → firefox 든 줄만 (프로세스 관리는 14편) $ ls ~ | tee saved-list.txt | wc -l ← tee: 흘러가는 걸 파일(saved-list.txt)에도 저장하면서 동시에 다음(wc)으로도 넘김. "중간에 한 부 떠두기"

파이프는 몇 개든 이을 수 있어요 — A | B | C | D. 각 도구는 한 가지만 잘하고, 조립으로 복잡한 일을 합니다. grep(거르기)·sort(정렬)·uniq(중복제거)·wc(세기)·head/tail(앞뒤 자르기) — 7편의 이 도구들이 파이프의 단골 부품입니다. (한 단계 더 나아간 xargs·awk·sed는 23편에서.)

실전 조합 5선 + 정리

"이런 걸 한 줄로?" 싶은 실전 예시들 — 다 위에서 배운 부품 조합입니다.

# 1) 큰 파일 찾기: 홈에서 50MB 넘는 파일 크기순으로 $ find ~ -type f -size +50M -exec ls -lh {} \; 2>/dev/null | sort -k5 -h # 2) 디스크 많이 먹는 폴더 top 10 $ du -sh ~/* 2>/dev/null | sort -h | tail -10 # 3) 명령어 사용 빈도: 최근 history 에서 제일 많이 친 명령 10개 $ history | awk '{print $2}' | sort | uniq -c | sort -rn | head -10 # 4) 어떤 단어가 든 줄 개수만 $ grep -i "warning" /var/log/syslog | wc -l # 5) 명령 출력 화면에도 보고 파일에도 남기기 $ sudo apt upgrade 2>&1 | tee ~/upgrade-$(date +%F).log
오늘의 정리: 명령은 입구 stdin(0) + 출구 stdout(1)·stderr(2). 리다이렉션: >(덮어쓰기)·>>(이어쓰기)·<(파일을 입력으로). 에러: 2> 파일(에러 따로)·2>&1(에러를 출력에 합치기)·&> 파일(둘 다)·/dev/null(버림). 파이프 |: 앞 출력 → 뒤 입력 직접 연결, 몇 개든 이음. 외울 둘: 2>/dev/null("에러 무시")·> 파일 2>&1("전부 로그"). >는 묻지 않고 덮어쓴다 — 중요 파일 조심.

시리즈 흐름

  1. 1~5편 입문 묶음 ✔   6편 파일 ✔   7편 텍스트 ✔   8편 nano ✔   9편 권한 ✔   10편 사용자·그룹 ✔   11편 apt ✔
  2. 12편 — 파이프와 리다이렉션 (이 글) ✔  — "기초" 묶음 완료
  3. 13편 — vim 기초 (nano 다음 단계, 또는 서버에 nano 없을 때) — "중급" 묶음 시작
  4. 14편~ — 프로세스 관리 / 디스크 / 네트워크 명령어 / ufw 방화벽 / SSH 키 / systemd 서비스 / cron …

오늘 할 일: ~/linux-practice에서 ls ~ > list.txtcat list.txtecho 추가 >> list.txtls /usr/bin | wc -lhistory | awk '{print $2}' | sort | uniq -c | sort -rn | head 한 바퀴. 마지막 한 줄에서 "내가 제일 많이 친 명령" 이 뜨면, 파이프 조립의 감이 옵니다. 13편에서 만나요. (셸 리다이렉션 전체는 bash 매뉴얼 Redirections에.)

우분투·리눅스 입문 시리즈

"기초" 묶음 완주 — 파일·텍스트·편집·권한·계정·패키지·파이프까지. 13편 "vim 기초"로 "중급" 묶음을 시작합니다.

다음 편은 JUNAI 블로그에서 이어 보세요.

© 2026 JUNAI · 우분투·리눅스 입문 시리즈 12편 · 본 글은 2026년 5월 12일 기준으로 작성되었습니다.

© 2026 주나이테크(주) @JUNAITECH