내가 들어가면
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.txt
stdout과 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을 두 번 리디렉션하는 것입니다. 마지막 항목만 적용됩니다.