나중에 사용하기 위해 Makefile에서 명령 종료 코드를 어떻게 캡처합니까?

나중에 사용하기 위해 Makefile에서 명령 종료 코드를 어떻게 캡처합니까?

다음과 같은 테스트 스위트 타겟이 포함된 makefile이 있습니다.

rcheck:
        foo

이는 stdout에 명령의 출력을 표시 하고 정상적으로 핸들을 만드는 foo종료 코드를 반환합니다 .foo

추가하고 싶어요무엇이 목표를 달성하려면 foo기존 동작에 영향을 주지 않고 출력을 구문 분석하세요. 즉:

  1. foostdout/stderr는 이전과 같이 stdout/stderr에 표시되어야 합니다.
  2. Make에 관한 한 rcheck 목표의 최종 결과는 foo종료 코드입니다.
  3. stdout from은 foo어떻게든 두 번째 명령에 전달되어야 합니다 bar. bar종료 코드는 중요하지 않습니다. bar위의 1. 이외의 어떤 것도 stdout 또는 stderr에 출력되어서는 안 됩니다(솔루션이 bar1. 자체를 처리하는 것을 의미하지 않는 한).

여기서 가장 독창적인 해결책은 무엇입니까?

답변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입니다.

기본 동작과 반대로:

파이프의 종료 상태는 마지막 명령의 종료 상태입니다.
파이프라인실패 옵션이 활성화되지 않은 경우.

관련 정보