programing tip

파이 명령 출력을 티로 출력하지만 명령의 종료 코드도 저장합니다

itbloger 2020. 6. 14. 11:03
반응형

파이 명령 출력을 티로 출력하지만 명령의 종료 코드도 저장합니다


이 질문에는 이미 답변이 있습니다.

출력을 로그 파일로 리디렉션하기 위해 명령 (mvn clean install)을 감싸는 쉘 스크립트가 있습니다.

#!/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하면서 출력을 로그 파일로 파이프하는 방법은 무엇입니까?


을 실행 중이므로 다음 대신 $ PIPESTATUS 변수를 bash사용할 수 있습니다 .$?

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

pipefail 쉘 옵션 옵션을 설정하여 원하는 동작을 얻을 수 있습니다.

로부터 배쉬 참조 설명서 :

pipefail옵션이 활성화되어 있지 않으면 파이프 라인의 종료 상태는 파이프 라인에서 마지막 명령의 종료 상태입니다 ( 내장 설정 참조 ). pipefail사용 가능한 경우 파이프 라인의 리턴 상태는 0이 아닌 상태로 종료하는 마지막 (가장 오른쪽) 명령의 값이거나 모든 명령이 성공적으로 종료되면 0입니다.

예:

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

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

$ set +o pipefail

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

반응형