표준 출력 및 표준 오류를 하나의 파일로 리디렉션

표준 출력 및 표준 오류를 하나의 파일로 리디렉션

나는 stdout과 stderr을 모두 동일한 파일로 리디렉션하는 두 가지 방법이 있다는 것을 이해하게 되었습니다. 첫 번째 방법은 ls -l /bin > ls-output.txt 2>&1 다음과 같습니다 .이 책상태: 이 방법을 사용하여 2개의 리디렉션을 수행합니다. 먼저 stdout을 ls-output.txt로 리디렉션한 다음 stderr(파일 설명자 2)를 stdout(파일 설명자 1 사용)으로 리디렉션합니다.

리디렉션 순서가 중요합니다.

ls -l /bin 2>&1 >ls-output.txtstderr를 화면으로 리디렉션합니다.

내 질문은: 많은 프로그래밍 언어와 마찬가지로 명령이 연관성과 우선 순위 규칙을 염두에 두고 설계되었는가입니다.그리고화면에 쓰는 동안 명령을 어떻게 읽나요?그리고명령의 백엔드 실행 순서는 무엇입니까?

실행 순서에 대해 제가 생각하는 것은 다음과 같습니다. 먼저 명령은 ls -l /bin출력을 stdout으로 보내고 오류는 stderr(이 중 하나)로 보냅니다. 그런 다음 stderr은 stdout으로 리디렉션됩니다.(오류가 있는 경우, 예: ls -l /binn사용되는 경우) 이제 stdout 스트림에는 두 가지(출력 또는 오류) 중 하나가 포함되어 파일로 리디렉션됩니다.ls-output.txt

답변1

리디렉션은 왼쪽에서 오른쪽으로 처리됩니다. 실행할 때:

ls -l /bin >ls-output.txt 2>&1

셸은 내부적으로 대략 다음 작업을 수행합니다.

fork(); // Then in the child process:
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);
// 2>&1
dup2(1, 2);

ls -l /bin그런 다음 이러한 설명자 첨부 파일을 사용하여 명령을 실행합니다 . stdout먼저 파일로 리디렉션하므로 리디렉션은 stderr해당 리디렉션을 상속합니다.

글을 쓰게 된다면

ls -l /bin 2>&1 >ls-output.txt

작업 순서가 반전됩니다.

// 2>&1
dup2(1, 2);
// >ls-output.txt
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);

이는 터미널일 가능성이 있는 stderr원본에 연결됩니다. 그런 다음 파일로 stdout리디렉션됩니다 . stdout이는 에 영향을 미치지 않습니다 stderr.

관련 정보