종료 값을 잃지 않고 ts 사용 [중복]

종료 값을 잃지 않고 ts 사용 [중복]

다음과 같이 많은 출력을 생성하는 긴 명령을 실행하는 빌드 스크립트가 있습니다.

./compile

ts컴파일 성능 문제를 해결하기 위해 다음을 사용하고 싶습니다 .더 많은 유틸리티) 각 출력 행 앞에 타임스탬프가 붙습니다. 그래서 스크립트를 다음과 같이 업데이트했습니다.

bash -c "./compile | ts '[%Y-%m-%d %H:%M:%S]'"

이것은 작동하지만 이제 종료 값은 항상 실패 0시 이벤트 입니다( 종료할 때 오류가 없기 compile때문에 ).ts

compile사용 시 종료 코드를 반환하도록 스크립트를 어떻게 업데이트합니까 ts?

답변1

Bash를 사용하고 있으므로 $PIPESTATUS파이프라인의 명령에 대한 다양한 종료 코드가 포함된 배열인 이것을 사용할 수 있습니다.

bash -c './compile | ts "[%Y-%m-%d %H:%M:%S]"; exit "${PIPESTATUS[0]}"'

zsh비슷한 기능이 있지만 $pipestatus대신 배열을 사용합니다( 대신 zsh배열에 번호가 매겨져 있다는 점을 기억하세요 ).10

답변2

, , 및 busybox를 포함한 pipefail일부 셸 지원 옵션을 사용할 수 있습니다 (뿐만 아니라bashksh93zshmkshyashashshPOSIX 사양의 다음 주요 버전에 추가될 예정입니다.) 파이프라인의 종료 상태가 맨 오른쪽에 있는 실패한 명령의 종료 상태가 되도록 합니다.

예를 들어, 종료 상태는 (exit 3) | (exit 4) | (exit 0)입니다 4.

bash -o pipefail -c "./compile | ts '[%Y-%m-%d %H:%M:%S]'"

./compile자체적으로 실패 하지 않는 한 ts종료 상태로 반환됩니다 .

관련 정보