STDERR로 인쇄하기 전에 파일을 수정하고 쓰는 방법

STDERR로 인쇄하기 전에 파일을 수정하고 쓰는 방법

stderrGitHub 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

기본적으로 다음과 같습니다.

  1. 파이프의 반환 상태를 0이 아닌 상태로 종료된 마지막 명령의 값으로 설정하거나, 모든 명령이 성공적으로 종료된 경우 0으로 설정합니다.
  2. 다음 stderr에서 복사됨stdout2&>1(또는 약어) 로 |&전달된 다음stdintee
  3. tee복사할 때 호출됩니다 stdin.stdoutartifact.txt
  4. 원래 파이프라인 설정을 복원합니다.

분명히 Bash에는 두 번째 명령으로 파이프를 허용하는 약식 구문이 없기 때문에 두 가지를 모두 사용하여 파일에 복사 stdout해야 했습니다 .stderrstderr


기타 참고자료:

답변2

그 후에는 bash다음을 실행할 수 있습니다.

$ somecommand 2>&1 | tee ./artifact.txt;echo "${PIPESTATUS[@]}"

그리고 전체 파이프라인의 종료 코드를 가져옵니다.

관련 정보