stdout 및 오류 문제

stdout 및 오류 문제

내가 들어가면

cat > file.txt 2>&1

그런 다음 표준 입력의 내용을 사용하여 file.txt생성 됩니다. cat하지만 내가 그렇게 한다면

cat > file.txt 1>&2

그런 다음 file.txt생성되었지만 파일이 비어 있었습니다.

위 두 명령의 문제점은 무엇입니까?

답변1

순서가 중요합니다. 쉘이 파일 리디렉션을 처리합니다.보는 순서대로요. 고려하다:

cat >file.txt 2>&1

먼저 stdout이 파일로 리디렉션됩니다 file.txt. 다음으로 stderr은 stdout으로 리디렉션됩니다. 즉, file.txtstdout과 stderr이 모두 file.txt.

이와 대조적으로 다음을 고려하십시오.

cat >file.txt 1>&2

먼저 stdout이 파일로 리디렉션됩니다 file.txt. (이렇게 하면 file.txt빈 파일이 생성됩니다.) 다음으로 stdout이 stderr로 리디렉션됩니다. 따라서 stdout은 stderr로 이동하지만 내용이 없으므로 빈 파일로 남아 있습니다 file.txt.file.txt

또 다른 흥미로운 사례

고려하다:

cat 2>&1 >file.txt

먼저 stderr은 여전히 ​​터미널인 stdout으로 리디렉션됩니다. 다음으로 stdout은 로 리디렉션됩니다 file.txt. 두 번째 리디렉션은 stderr에 영향을 주지 않습니다. 여전히 터미널로 전송됩니다. 이것은아니요발행 된 file.txt.

문서

이 동작은 다음에 문서화되어 있습니다 man bash.

리디렉션은 표시된 순서대로 왼쪽에서 오른쪽으로 처리됩니다.

이 순서의 예외는 파이프이며 에도 설명되어 있습니다 man bash. 고려하다:

command1 ... | command2

표준 출력은 command1파이프를 통해 표준 입력으로 전송되고 command2이 연결을 수행합니다. 앞으로첫 번째 명령으로 지정된 모든 리디렉션.

파이프라인 예시

고려하다:

command1 >file.txt | command2

리디렉션이 file.txt발생하기 때문에뒤쪽에파이프로 리디렉션되면 stdout은 command1으로 이동합니다 file.txt. command2입력이 수신되지 않습니다.

답변2

"> file"을 실행하면 실제로 "1> file"이 실행됩니다. 따라서 당신이 해야 할 일은 파일 설명자 1을 두 번 리디렉션하는 것입니다. 마지막 항목만 적용됩니다.

관련 정보