stdin, stderr, 리디렉션 및 로그

stdin, stderr, 리디렉션 및 로그

이 두 줄 사이에 차이가 있나요?

/home/user/script.sh >> /home/user/stdout_and_error.log  2>&1
/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log  

스크립트의 표준 출력 및 실행 오류를 로그 파일에 저장하고 싶다는 것을 알고 있습니다. 차이가 없다면 로깅 자체를 기록하고 싶다면 어떻게 해야 할까요?

답변1

네, 조금 다릅니다.

/home/user/script.sh >> /home/user/stdout_and_error.log  2>&1

그러면 STDOUT 및 STDERR이 /home/user/stdout_and_error.log.

/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log  

그러면 STDOUT이 이전 STDOUT으로 전송 /home/user/stdout_and_error.log되고 STDERR이 이전 STDOUT으로 전송됩니다.

 

쉘 리디렉션을 수행하면 리디렉션의 왼쪽이 현재 리디렉션의 오른쪽이 있는 위치로 이동합니다. 즉 2>&1, 현재 STDOUT(1)이 있는 곳으로 STDERR(2)를 보냅니다.
그러나 STDOUT을 다른 곳으로 리디렉션하면 STDERR이 따르지 않습니다. STDOUT이 이전에 있었던 곳에서 계속됩니다. 그렇기 때문에 첫 번째 예에서는 STDOUT과 STDERR이 모두 동일한 위치로 이동하지만 두 번째 예에서는 그렇지 않습니다.

답변2

첫 번째 명령줄에서 쉘은 먼저 >> file을 확인하고 stdout을 file에 추가합니다. 다음 2>&1은 fd1이 갈 동일한 위치(파일)로 fd2(stderr)를 보냅니다. 이것이 당신이 원하는 것입니다.

두 번째 명령줄에서 쉘은 먼저 2>&1을 확인합니다. 이는 "표준 오류(파일 설명자 2)가 표준 출력(fd1)과 동일한 위치로 이동하게 합니다."를 의미합니다. fd2와 fd1이 이미 터미널에 있으므로 효과가 없습니다. 그런 다음 >> file은 fd1(stdout)을 file에 추가합니다. 그러나 fd2(stderr)는 여전히 터미널로 이동합니다.

답변3

>> 추가stdout(스트림 #1)을 파일로 변환합니다.

2>&1stderr(스트림 #2)를 stdout(스트림 #1)과 결합합니다(stdout에 stderr 추가).

>stdout(스트림 #1)을 파일에 쓰고 파일을 덮어씁니다.

1>stdout(스트림 #1)을 파일에 쓰고 파일을 덮어씁니다. 같은 상기와.

2>파일에 stderr(스트림 #2)를 쓰고 파일을 덮어씁니다.

+++

첫 번째 예제에서는 stdout을 파일에 추가한 다음 stderr을 stdout에 추가합니다.

두 번째 예는 stdout에 stderr을 추가한 다음 추가합니다.결합된stdout(stderr 포함)을 파일로 변환합니다.

관련 정보