명령 출력을 파일로
<(cmd)는 명령의 표준 출력을 다른 프로그램이 파일 경로처럼 열 수 있는 이름으로 노출해. diff처럼 두 개 이상의 파일 인자를 요구하는 도구에 여러 스트림을 연결할 때 유용해.
두 명령 출력 비교
diff <(ls dir1) <(ls dir2)
diff <(sort a.txt) <(sort b.txt)
comm -23 <(sort users-now.txt) <(sort users-yesterday.txt)지원하는 시스템에서 bash는 흔히 열린 파일 디스크립터를 /dev/fd/63 같은 경로로 노출하고, 그렇지 않으면 이름 있는 FIFO를 만들 수 있어. 받는 프로그램이 일반 파일처럼 seek해야 하거나 같은 입력을 여러 번 여는 경우에는 동작하지 않을 수 있으므로 순서대로 한 번 읽는 도구에 가장 잘 맞아.
아웃바운드: >(cmd)
some_cmd >(gzip > out.gz) 2> errors.log
tar c -f >(ssh remote 'cat > backup.tar') /home이 형태는 덜 쓰이지만 강력해. 앞 명령은 경로에 쓴다고 생각하지만, 그 경로로 보낸 데이터는 실제로 다른 명령의 stdin으로 들어가.
그냥 파이프 쓰면 안 돼?
파이프 하나는 입력 스트림 하나만 연결해. 프로세스 치환은 파일 인자를 기대하는 diff, comm, paste, join 같은 도구에 둘 이상의 입력을 동시에 공급할 수 있어.
POSIX sh에서는 쓸 수 없어
프로세스 치환은 bash와 zsh의 확장 문법이라 POSIX sh에서는 사용할 수 없어. 휴대성이 우선이면 안전하게 만든 임시 파일과 정리를 쓰고, 이 문법이 주는 간결함이 중요하면 shebang으로 bash나 zsh를 명시해.
안쪽 명령의 실패가 가려질 수 있어
diff <(cmd1) <(cmd2)의 바깥 종료 상태는 보통 diff 결과를 말해. 프로세스 치환 안쪽 명령이 실패해 빈 출력만 남겨도 호출자가 그 원인을 바로 받지 못할 수 있어. 중요한 자동화에서는 각 명령을 따로 실행해 상태를 확인하거나 임시 파일에 결과와 오류를 명시적으로 남겨.
임시 파일이 더 나은 순간도 있어
입력을 다시 읽어야 하거나, 실패 후 증거를 보존해야 하거나, 아주 큰 결과의 생성과 소비 시점을 분리해야 한다면 임시 파일이 더 투명해. 줄 하나를 줄이는 것이 항상 더 좋은 설계는 아니야. 관찰 가능성과 복구 가능성까지 비용에 넣어.