code

tee에 대한 파이프 명령 출력 및 종료 명령 코드 저장

starcafe 2023. 5. 23. 22:02
반응형

tee에 대한 파이프 명령 출력 및 종료 명령 코드 저장

출력을 로그 파일로 리디렉션하기 위해 명령을 래핑하는 셸 스크립트(mvn 클린 설치)가 있습니다.

#!/bin/bash
...
mvn clean install $@ | tee $logfile
echo $? # Does not show the return code of mvn clean install

이제 만약에mvn clean install오류로 인해 실패합니다. 래퍼 셸 스크립트도 해당 오류로 인해 실패합니다.하지만 모든 출력물을 티에 파이프로 연결하고 있기 때문에 다음의 반환 코드에 액세스할 수 없습니다.mvn clean install그래서 제가 접속합니다.$?이후에는 항상 0입니다(성공 이후).

명령어가 오류 출력을 다른 파일에 쓰도록 하고 이후에 확인하려고 했지만, mvn의 오류 출력은 항상 비어 있습니다(stdout에만 쓰는 것 같습니다).

의 반송 코드를 보존하려면 어떻게 해야 합니까?mvn clean install하지만 여전히 출력을 로그 파일에 파이핑하고 있습니까?

설정할 수 있습니다.pipefail 원하는 동작을 가져오려면 셸 옵션을 선택합니다.

Bash 참조 매뉴얼:

파이프라인의 종료 상태는 다음과 같은 경우를 제외하고 파이프라인에 있는 마지막 명령의 종료 상태입니다.pipefail옵션을 사용할 수 있습니다(기본 제공 설정 참조).한다면pipefail활성화된 경우 파이프라인의 반환 상태는 0이 아닌 상태로 종료할 마지막(맨 오른쪽) 명령 값이며, 모든 명령이 성공적으로 종료될 경우 0입니다.

예:

$ false | tee /dev/null ; echo $?
0
$ set -o pipefail
$ false | tee /dev/null ; echo $?
1

원래 파이프 설정을 복원하려면:

$ set +o pipefail

당신이 달리고 있으니까요.bash$PIPESTATUS 변수를 사용할 수 있습니다.$?:

mvn clean install $@ | tee $logfile
echo ${PIPESTATUS[0]}

mvn 명령을 실행하고 종료 코드를 캐시할 수 있습니다...예를 들어 "false" 명령을 사용합니다.

$ { false ; echo $? > /tmp/false.status ; } | tee $logfile
$ cat /tmp/false.status
1

그러면 상태 파일 내용을 사용하여 추가 결정을 내릴 수 있습니다.

저는 지금 이것을 성취할 수 있는 더 웅변적인 방법이 있는지 궁금합니다.

해결 방법(참고: @Frederic 솔루션 선호):

f=`mktemp`
(mvn clean install $@; echo $?>$f) | tee $logfile
e=`cat $f` #error in variable e
rm $f

언급URL : https://stackoverflow.com/questions/6871859/piping-command-output-to-tee-but-also-save-exit-code-of-command

반응형