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

프로세스 치환

~8 min · process-substitution, compare

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

명령 출력을 파일로

<(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 결과를 말해. 프로세스 치환 안쪽 명령이 실패해 빈 출력만 남겨도 호출자가 그 원인을 바로 받지 못할 수 있어. 중요한 자동화에서는 각 명령을 따로 실행해 상태를 확인하거나 임시 파일에 결과와 오류를 명시적으로 남겨.

임시 파일이 더 나은 순간도 있어

입력을 다시 읽어야 하거나, 실패 후 증거를 보존해야 하거나, 아주 큰 결과의 생성과 소비 시점을 분리해야 한다면 임시 파일이 더 투명해. 줄 하나를 줄이는 것이 항상 더 좋은 설계는 아니야. 관찰 가능성과 복구 가능성까지 비용에 넣어.

Code

두 명령 출력 비교·bash
# 두 서버의 설치 패키지 목록 비교
diff <(ssh boxA dpkg -l | sort) <(ssh boxB dpkg -l | sort)
# 왼쪽에만 있는 줄
comm -23 <(sort a.txt) <(sort b.txt)
# 오른쪽에만 있는 줄
comm -13 <(sort a.txt) <(sort b.txt)

External links

Exercise

두 디렉터리의 파일 이름을 각각 정렬해 diff <(…) <(…)로 비교해. 한쪽 명령을 일부러 실패시킨 뒤 diff의 종료 상태만으로 그 실패를 알아챌 수 있는지도 확인해. 원격 호스트가 필요한 예제 대신 로컬 샌드박스에서 스트림의 경계를 먼저 익혀.

Progress

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

댓글 0

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

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