이 두 줄 사이에 차이가 있나요?
/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>&1
stderr(스트림 #2)를 stdout(스트림 #1)과 결합합니다(stdout에 stderr 추가).
>
stdout(스트림 #1)을 파일에 쓰고 파일을 덮어씁니다.
1>
stdout(스트림 #1)을 파일에 쓰고 파일을 덮어씁니다. 같은 상기와.
2>
파일에 stderr(스트림 #2)를 쓰고 파일을 덮어씁니다.
+++
첫 번째 예제에서는 stdout을 파일에 추가한 다음 stderr을 stdout에 추가합니다.
두 번째 예는 stdout에 stderr을 추가한 다음 추가합니다.결합된stdout(stderr 포함)을 파일로 변환합니다.