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
에서는 sh
stdout을 다른 명령으로만 파이프할 수 있으므로 먼저 stdout과 stderr을 바꿔야 합니다.
/bin/snowsql -f /home/scripts/dev/dev.sql 3>&2 2>&1 >&3 3>- | tee /home/scripts/dev/stderr.txt
리디렉션은 처음에 생성되는 파이프를 제외하고 왼쪽에서 오른쪽으로 수행되므로 수행되는 작업은 다음과 같습니다.
- 파이프를 열고 그 안에 stdout을 리디렉션합니다(
|
). - 나중에 재사용할 수 있도록 stderr를 복사하고 파일 설명자 3(임의)을 여기에 리디렉션합니다(
3>&2
). - stdout(현재 파이프로 리디렉션됨)을 복사하고 stderr를 파이프로 리디렉션합니다(
2>&1
). - 파일 설명자 3을 복제하고(현재 원본 stderr로 리디렉션됨) stdout을 해당 파일로 리디렉션합니다(
>&3
). - 파일 설명자 3 닫기(
3>-
)
이 상태에서 우리는 stdout과 stderr을 교환하고, 파이프는 stderr를 받습니다. 그런 다음 tee
표준 오류를 파일에 기록하고 자체 표준 출력으로 다시 출력하는 작업을 수행 하도록 합니다 .
팁에 대한 StackOverflow 답변에 감사드립니다.https://stackoverflow.com/a/2381643