파이 명령 출력을 티로 출력하지만 명령의 종료 코드도 저장합니다
이 질문에는 이미 답변이 있습니다.
- Bash 15 답변의 파이프 출력 및 캡처 종료 상태
출력을 로그 파일로 리디렉션하기 위해 명령 (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
'programing tip' 카테고리의 다른 글
AVAudioRecorder를 사용하여 iPhone에서 오디오를 녹음하려면 어떻게합니까? (0) | 2020.06.14 |
---|---|
예를 들어 (공동, 대조 및 in) 분산이 어떻게 작동합니까? (0) | 2020.06.14 |
이동하는 생성자 (0) | 2020.06.14 |
가장 컴팩트 한 매핑을 만드는 방법 n → isprime (n) 최대 한계 N? (0) | 2020.06.14 |
열거 형에서 임의의 값을 선택 하시겠습니까? (0) | 2020.06.14 |