stdout과 stderr을 모두 파일로 리디렉션할 때 stderr을 stdout으로 리디렉션하는 것이 마지막에 배치되어야 하는 이유는 무엇입니까? [복사]

stdout과 stderr을 모두 파일로 리디렉션할 때 stderr을 stdout으로 리디렉션하는 것이 마지막에 배치되어야 하는 이유는 무엇입니까? [복사]

stdout 및 stderr을 파일로 리디렉션하려면 다음을 수행하세요.

curl 'https://example.com' > myfile 2>&1

이것은 잘 작동하지만 왜 stderr를 stdout으로 리디렉션하는 작업이 마지막에 이루어져야 합니까?

왜 그럴 수 없습니까?

curl 'https://example.com' 2>&1 > myfile

이 대안이 작동하지 않는 이유를 이해할 수 없습니다. stderr을 파일로 리디렉션하지 않습니다. 왼쪽에서 오른쪽으로 읽기: "웹 페이지 다운로드, stderr를 stdout으로 리디렉션, stdout을 파일로 리디렉션"이지만 이는 분명히 Bash가 명령을 해석하는 방식이 아닙니다. Bash가 2>&1마지막에 올 것으로 예상됩니다 . 왜 2>&1맨 마지막에 넣어야 하는 걸까요 ?

답변1

저를 믿으세요. 저는 오랫동안 이 질문을 받아왔습니다. 이제 나는 그것을 간단한 말로 기억합니다.

여기서의 의미 fd는 입니다 file descriptor.

두 번째 경우에는 이전에 있었던 위치를 fd2가리킵니다 . fd1그러면 fd2다른 곳을 가리킬 것입니다.

더 쉽게 이해하려면 다음을 고려하십시오.

fd1 --> stdout
2>&1, means fd2 --> stdout
then >some_file means fd1 --> some_file

따라서 fd2따라가는 것이 fd1아니라 목표를 따라가는 것입니다 fd1.

관련 정보