표준 입출력, 파이프(|), 리다이렉션(>, >>)
8강. 표준 입출력, 파이프(|), 리다이렉션(>, >>)
1. 이번 강의에서 해결할 문제
파이프와 리다이렉션은 강력하지만 >는 기존 파일을 즉시 덮어씁니다. 출력 흐름을 먼저 터미널에서 확인하고 새 결과 파일로 보냅니다.
2. 학습 목표
3. 핵심 개념
프로세스는 표준 입력(0), 표준 출력(1), 표준 오류(2)를 기본 채널로 사용합니다. |는 앞 명령의 stdout을 다음 명령의 stdin으로 연결합니다. >는 대상 파일을 새로 쓰고 >>는 뒤에 추가합니다. 기존 결과를 보호하려면 새 파일 이름을 사용하고 test -e로 존재 여부를 확인합니다.
| 채널·연산자 | 의미 | 화면·파일에 미치는 영향 |
|---|---|---|
stdin 0 | 프로그램이 읽는 기본 입력 | 키보드 또는 <·파이프에서 들어옵니다. |
stdout 1 | 정상 결과 | 기본은 화면, >나 파이프로 보낼 수 있습니다. |
stderr 2 | 오류·진단 메시지 | 기본 파이프에는 섞이지 않고 화면에 남습니다. |
> | stdout으로 새로 쓰기 | 기존 대상 내용을 덮어씁니다. |
>> | stdout 뒤에 추가 | 기존 내용은 유지하고 마지막에 붙입니다. |
파이프는 임시 파일 없이 작은 명령의 책임을 연결할 때 사용합니다. 하지만 앞 명령이 실패해도 뒤 명령이 빈 입력으로 실행될 수 있으므로 실제 자동화에서는 종료 상태와 pipefail 정책도 함께 검토합니다.
GNU Bash 리다이렉션 문서의 덮어쓰기 규칙을 기준으로 설명합니다.
4. 단계별 명령어와 예시
1. Ubuntu Bash(WSL)
실행 위치: 프로젝트 루트
대상: 승리 기록 요약과 별도 오류 로그
명령 목적: 전용 연습 CSV의 정상 출력을 정렬해 화면과 새 파일에 동시에 보내고, 로그의 새 쓰기와 추가 쓰기를 비교합니다.
실행 전 상태: pwd가 ~/projects/game-log-analyzer인지 확인하고 reports 폴더가 있어야 합니다. 아래 명령은 pipe-practice.csv, wins.preview.txt, run.log가 없을 때만 처음 내용을 씁니다. 이미 있다면 삭제하지 말고 다른 연습 이름을 선택합니다.
cd "$HOME/projects/game-log-analyzer"
if test -e data/pipe-practice.csv; then echo "data/pipe-practice.csv가 이미 있습니다."; else printf "Alice,golem,120,win\nBob,slime,80,lose\nCara,dragon,240,win\n" > data/pipe-practice.csv; fi
if test -e reports/wins.preview.txt; then echo "reports/wins.preview.txt가 이미 있습니다."; else grep "win" data/pipe-practice.csv | sort | tee reports/wins.preview.txt; fi
wc -l < reports/wins.preview.txt
if test -e reports/run.log; then echo "reports/run.log가 이미 있어 덮어쓰지 않습니다."; else printf "analysis started\n" > reports/run.log; fi
printf "analysis finished\n" >> reports/run.log
cat reports/run.log
예상 결과: 첫 실행에서는 Alice와 Cara의 승리 두 줄이 정렬되어 화면과 wins.preview.txt에 기록되고 wc -l은 2를 표시합니다. run.log에는 analysis started, analysis finished 두 줄이 보입니다. 같은 이름의 파일이 이미 있으면 덮어쓰지 않는 안내가 먼저 나옵니다.
5. 명령어가 동작하는 이유
tee는 파이프 데이터를 화면과 파일로 동시에 보냅니다. 입력 리다이렉션 <은 파일 내용을 wc의 stdin으로 전달하고, 존재 검사 뒤 >를 사용해 기존 로그를 보호합니다.
데이터 흐름은 grep의 stdout → 파이프 → sort의 stdin → sort의 stdout → tee → 화면과 파일입니다. stderr는 이 흐름에 자동으로 들어가지 않습니다. wc -l < 파일에서는 셸이 파일을 열어 wc의 stdin으로 연결하므로 출력에는 파일명 없이 줄 수만 나타납니다.
6. 자주 하는 실수와 안전한 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
10. 다음 강의 연결
표준 출력의 흐름을 안전하게 연결했습니다. 다음 강의에서는 파이프에 전달할 파일 집합이 경로·글로브·따옴표에 따라 어떻게 달라지는지 확인합니다.
표준 입출력, 파이프(|), 리다이렉션(>, >>) 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.