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
'code' 카테고리의 다른 글
Express에 등록된 모든 경로를 가져오는 방법은 무엇입니까? (0) | 2023.05.23 |
---|---|
모범 사례? - 핵심 데이터 엔티티 속성으로서의 어레이/사전 (0) | 2023.05.23 |
[routerLink]와 routerLink의 차이점 (0) | 2023.05.23 |
MongoDB에서 OneOverfindOneAndUpdate를 통한 업데이트 사용 사례 (0) | 2023.05.23 |
Mongo ObjectId를 직렬화하는 동안 JSON.NET 캐스트 오류가 발생했습니다. (0) | 2023.05.23 |