xargs로 표준 입력을 명령 인자로 바꾸기
rm, mv와 git add 같은 명령은 파일명을 표준 입력이 아니라 인자로 받아. xargs는 표준 입력을 항목으로 나눠 다음 명령의 인자 목록으로 전달해.
알아야 할 플래그
-n 1은 한 번 실행할 때 인자를 하나씩 넘겨.-I {}는 입력 항목을{}자리에 넣어 인자 위치를 정할 수 있게 해.-0은 NUL로 구분된 입력을 읽으므로find -print0와 함께 쓰면 공백과 줄바꿈이 든 파일명도 보존해.-P 4는 최대 네 작업을 병렬로 실행해.-r은 GNU 구현에서 입력이 비었을 때 명령 실행을 건너뛰어. macOS의 BSD 구현은 기본적으로 같은 동작을 해.
tee: 스트림 분기
tee는 표준 입력을 표준 출력과 하나 이상의 파일에 동시에 써. 결과를 화면에서 보면서 파일에도 남기고 싶을 때 사용해.
cmd | tee out.log는 화면에 출력하면서 파일에도 저장해.cmd | tee -a out.log는 기존 파일의 뒤에 출력을 덧붙여.cmd | sudo tee /etc/protected.conf는 파이프라인 결과를 관리자 권한이 필요한 파일에 쓸 때 사용하는 형태야.
합쳐서
find . -name '*.log' | xargs gzip은 찾은 로그를 압축해. 파일명 경계를 지키면서 병렬 처리하려면 find . -name '*.log' -print0 | xargs -0 -I {} -P 4 gzip {}처럼 써. ./build.sh | tee build.log | grep -i error는 전체 출력을 저장하면서 오류가 든 줄만 화면에 보여 줘.
파일명을 넘길 때는 NUL 경계를 써
줄바꿈으로 구분한 xargs 입력은 공백, 따옴표, 줄바꿈이 든 이름에서 깨질 수 있어. 파일 목록은 생산자가 -print0, 소비자가 -0를 지원하는 조합으로 넘겨. 사람이 만든 단순 단어 목록과 임의의 경로를 구분해야 해.
tee 뒤의 성공만 보지 마
파이프라인 중간에 tee를 넣으면 화면과 파일을 함께 얻지만 앞 단계나 파일 쓰기 실패가 최종 상태에서 가려질 수 있어. 파이프라인 각 단계와 목적지의 오류를 따로 확인하고, 중요한 산출물은 임시 파일에 완전히 쓴 뒤 교체해.