쉘에서 stderr로 다시 리디렉션

쉘에서 stderr로 다시 리디렉션

bash 쉘 태그를 사용하여 SO에서 실수로 요청했고 이것이 더 적절한 장소라고 생각했기 때문에 다시 질문했습니다.

AWS DataPipeline에서 관계형 데이터베이스에 연결하는 셸 스크립트를 작성 중인데 SQL 오류에도 종료 코드가 0이므로 stderr를 캡처하고 리디렉션해야 합니다.

내용을 확인하기 위해 stderr를 다른 파일로 리디렉션했지만 여전히 stderr가 채워지기를 원합니다. 그 이유는 DataPipeline이 모든 stderr 및 stdout을 캡처하여 모두 하나의 로그에 넣기 때문입니다. 리디렉션으로 인해 실패한 SQL 명령에서 stderr을 캡처하지 않습니다. 여전히 stderr를 채우는 방법이 있습니까? 내가 현재 가지고 있는 것은 다음과 같습니다.

/bin/snowsql -f /home/scripts/dev/dev.sql 2> /home/scripts/dev/stderr.txt

Bash에는 다음이 적용됩니다.

/bin/snowsql -f /home/scripts/dev/dev.sql 2> >(tee /home/scripts/dev/stderr.txt >&2)

쉘 프로세스 대체에 대한 올바른 구문을 찾을 수 없습니다. 쉘에서 위의 작업을 수행하는 것과 동일한 것은 무엇입니까?

답변1

에서는 shstdout을 다른 명령으로만 파이프할 수 있으므로 먼저 stdout과 stderr을 바꿔야 합니다.

/bin/snowsql -f /home/scripts/dev/dev.sql 3>&2 2>&1 >&3 3>- | tee /home/scripts/dev/stderr.txt

리디렉션은 처음에 생성되는 파이프를 제외하고 왼쪽에서 오른쪽으로 수행되므로 수행되는 작업은 다음과 같습니다.

  1. 파이프를 열고 그 안에 stdout을 리디렉션합니다( |).
  2. 나중에 재사용할 수 있도록 stderr를 복사하고 파일 설명자 3(임의)을 여기에 리디렉션합니다( 3>&2).
  3. stdout(현재 파이프로 리디렉션됨)을 복사하고 stderr를 파이프로 리디렉션합니다( 2>&1).
  4. 파일 설명자 3을 복제하고(현재 원본 stderr로 리디렉션됨) stdout을 해당 파일로 리디렉션합니다( >&3).
  5. 파일 설명자 3 닫기( 3>-)

이 상태에서 우리는 stdout과 stderr을 교환하고, 파이프는 stderr를 받습니다. 그런 다음 tee표준 오류를 파일에 기록하고 자체 표준 출력으로 다시 출력하는 작업을 수행 하도록 합니다 .

팁에 대한 StackOverflow 답변에 감사드립니다.https://stackoverflow.com/a/2381643

관련 정보