다음과 같은 테스트 스위트 타겟이 포함된 makefile이 있습니다.
rcheck:
foo
이는 stdout에 명령의 출력을 표시 하고 정상적으로 핸들을 만드는 foo
종료 코드를 반환합니다 .foo
추가하고 싶어요무엇이 목표를 달성하려면 foo
기존 동작에 영향을 주지 않고 출력을 구문 분석하세요. 즉:
foo
stdout/stderr는 이전과 같이 stdout/stderr에 표시되어야 합니다.- Make에 관한 한 rcheck 목표의 최종 결과는
foo
종료 코드입니다. - stdout from은
foo
어떻게든 두 번째 명령에 전달되어야 합니다bar
.bar
종료 코드는 중요하지 않습니다.bar
위의 1. 이외의 어떤 것도 stdout 또는 stderr에 출력되어서는 안 됩니다(솔루션이bar
1. 자체를 처리하는 것을 의미하지 않는 한).
여기서 가장 독창적인 해결책은 무엇입니까?
답변1
데이터가 foo에서 bar로 전달되는 데 걸리는 시간이 걱정되지 않고 깨끗한 대상에서 처리해야 하는 임시 파일을 사용할 수 있다면 다음을 수행하세요.
rcheck:
foo | tee sometempfile
-bar < sometempfile >/dev/null 2>/dev/null
반면에 시간에 정말로 관심이 있다면 bar가 stdout에 대한 입력을 반복하도록 하고 다음과 같이 시도해 볼 수 있습니다.
rcheck:
-(foo; echo $$? > sometempfile) | bar
exit $(cat sometempfile)
더 깨끗한 방법이 있다고 확신하지만 위의 방법을 생각했습니다. (참고로 둘 다 테스트되지 않았습니다)
답변2
사용 중인 셸이 이 pipefail
옵션을 지원하는 경우(bash, ksh 및 zsh 모두 지원) 다음을 수행할 수 있습니다.
rcheck:
set -o pipefail; foo | tee /dev/stderr | { bar >/dev/null 2>&1; true; }
내 ksh 매뉴얼 페이지에서는 이 옵션을 다음과 같이 문서화합니다.
파이프 고장 파이프라인의 모든 구성 요소가 완료될 때까지 파이프라인은 완료되지 않습니다. 완료되면 반환 값은 0이 아닌 마지막 값이 됩니다. 명령이 실패했습니다. 실패한 명령이 없으면 0입니다.
기본 동작과 반대로:
파이프의 종료 상태는 마지막 명령의 종료 상태입니다. 파이프라인실패 옵션이 활성화되지 않은 경우.