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.txt
stderr를 화면으로 리디렉션합니다.
내 질문은: 많은 프로그래밍 언어와 마찬가지로 명령은 연관성과 우선순위 규칙을 염두에 두고 설계되었습니다.그리고화면에 명령을 쓰면서 어떻게 명령을 읽나요?그리고백그라운드에서 명령이 실행되는 순서는 무엇입니까?
실행 순서에 대해 제가 생각하는 방법은 다음과 같습니다. 먼저 명령은 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
.