stderr
GitHub Actions를 통해 자동 풀 요청 검사를 수행하고 있으며 작업 간에 명령 출력의 일부 데이터를 유지하고 싶습니다 .
stderr
이를 위해 나는인공 생산하지만 그 전에 일부 제어 문자도 제거해야 합니다 sed
. 그렇지 않으면 다음과 같은 결과가 발생합니다.
\x1b[31mFound 344 errors!\x1b[39;49m
그런 다음 주 명령이 동일한 종료 코드를 반환하여 검사에 실패하고 풀 요청이 병합되는 것을 방지하기를 원합니다.
아마도 수행해야 할 작업의 하위 집합을 처리할 수 있지만 세 가지 작업을 모두 함께 처리할 수는 없습니다(sed > file write > stderr). 더 쉽다면 stdout
파일 에 및 를 쓸 수도 있습니다 stderr
.
이 작업을 다르게 수행하기 위한 제안을 여십시오.
답변1
쉘 리디렉션 연산자의 조합을 사용하여 이 문제를 해결할 수 있었습니다.tee
유틸리티 금액pipefail
쉘 옵션:
set -o pipefail; somecommand 2&>1 | tee ./artifact.txt; set +o pipefail
기본적으로 다음과 같습니다.
- 파이프의 반환 상태를 0이 아닌 상태로 종료된 마지막 명령의 값으로 설정하거나, 모든 명령이 성공적으로 종료된 경우 0으로 설정합니다.
- 다음
stderr
에서 복사됨stdout
2&>1
(또는 약어) 로|&
전달된 다음stdin
tee
tee
복사할 때 호출됩니다stdin
.stdout
artifact.txt
- 원래 파이프라인 설정을 복원합니다.
분명히 Bash에는 두 번째 명령으로 파이프를 허용하는 약식 구문이 없기 때문에 두 가지를 모두 사용하여 파일에 복사 stdout
해야 했습니다 .stderr
stderr
기타 참고자료:
답변2
그 후에는 bash
다음을 실행할 수 있습니다.
$ somecommand 2>&1 | tee ./artifact.txt;echo "${PIPESTATUS[@]}"
그리고 전체 파이프라인의 종료 코드를 가져옵니다.