작은 명령을 연결하는 기호
파이프 기호 |는 왼쪽 명령의 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로 표본을 남기거나 각 단계를 따로 실행해 재현 가능한 입력을 확보해.