본문 바로가기
C.W.K.
Stream
Lesson 05 of 10 · published

파이프: Unix를 조합하는 힘

~12 min · pipe, composition, philosophy

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

작은 명령을 연결하는 기호

파이프 기호 |는 왼쪽 명령의 stdout을 오른쪽 명령의 stdin에 연결해. Doug McIlroy가 1973년 Bell Labs에서 이 방식을 도입하면서 작은 프로그램을 조합하는 패턴이 Unix의 핵심으로 자리 잡았어.

각 단계는 별도 프로세스야

cmd1 | cmd2 | cmd3는 세 프로세스를 띄워. 세 단계는 동시에 실행되고, 커널이 사이의 데이터를 버퍼링해. 중간 파일에 전부 쓴 뒤 다음 단계가 시작되는 구조가 아니야.

왼쪽에서 오른쪽으로 읽기

ps aux | grep python | grep -v grep | wc -l은 모든 프로세스를 나열하고, python이 든 줄만 남기고, grep 자체를 제외한 다음 줄 수를 세는 순서야. 각 단계가 받는 입력과 내보내는 출력을 말로 설명할 수 있으면 파이프의 경계도 보이기 시작해.

파이프라인의 종료 상태

기본 종료 상태는 마지막 명령의 값이야. 그래서 cat missing | wc -l은 cat이 실패해도 wc가 성공하면 0을 반환할 수 있어. set -o pipefail을 켜면 앞 단계의 실패도 파이프라인 실패로 드러나. 스크립트에서는 set -euo pipefail을 쓰되 각 옵션의 예외 규칙도 함께 알아야 해.

파이프가 맞지 않는 작업

파이프는 바이트를 순서대로 흘려보내지만 sort나 일부 jq 필터처럼 전체 입력을 먼저 봐야 하는 도구는 내부에 데이터를 모아. 입력이 아주 크거나 임의 접근이 필요하면 임시 파일, 이름 있는 파이프, 프로세스 치환 가운데 관찰과 복구에 맞는 구조를 골라.

중간 결과는 저장되지 않아

소비자가 읽는 속도에 맞춰 데이터가 흐르고, head처럼 뒤 단계가 일찍 끝나면 앞 단계는 SIGPIPE를 받을 수 있어. 이는 정상 종료 흐름일 수도 있으므로 pipefail이 보여 주는 모든 0이 아닌 상태를 같은 장애로 해석하면 안 돼.

긴 파이프라인은 관찰 지점을 지워

변환을 한 줄에 길게 이어 붙이면 중간 형식과 종료 상태를 보기 어려워져. 결과가 이상하면 단계를 나눠 표본을 저장하고 각 상태를 확인해. 최종 명령을 추측으로 고치기보다 처음 계약이 깨진 단계를 찾는 편이 빠르고 안전해. 조사하는 동안에는 tee로 표본을 남기거나 각 단계를 따로 실행해 재현 가능한 입력을 확보해.

Code

전형적인 파이프 패턴·bash
# 가장 자주 쓴 셸 명령 10개
history | awk '{print $2}' | sort | uniq -c | sort -rn | head
# grep 자체를 빼고 실행 중인 Python 프로세스 찾기
ps aux | grep python | grep -v grep
# 프로젝트의 단어 수 세기
find . -name '*.py' | xargs wc -l | tail -1
pipefail이 살린다·bash
set -o pipefail
cat missing.txt | wc -l   # cat 실패를 반영해 상태 1로 종료
echo "$?"

External links

Exercise

기본 셸에서 false | true의 종료 상태를 확인한 뒤, 별도 셸에서 pipefail을 켜 같은 파이프라인을 다시 실행해. 각 실행 뒤에 즉시 상태를 확인하고, 앞 단계 실패가 최종 상태에 어떻게 반영되는지 비교해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.