2>&1 >output.log와 2>&1 teeoutput.log의 차이점 |

2>&1 >output.log와 2>&1 teeoutput.log의 차이점 |

다음 두 명령의 차이점을 알고 싶습니다

2>&1 > output.log 

그리고

2>&1 | tee output.log

나는 동료 중 한 명이 리디렉션을 위해 두 번째 옵션을 사용하는 것을 보았습니다. 2>&1이 무엇인지 알고 있습니다. 유일한 질문은 tee를 사용하는 목적이 무엇인지입니다. ">" 연산자를 사용하여 간단한 리디렉션을 수행할 수 있습니까?

답변1

두 명령을 각각 살펴보십시오.

utility 2>&1 >output.log 

여기서 리디렉션은 왼쪽에서 오른쪽 방식으로 처리되므로 표준 오류 스트림은 먼저 표준 출력 스트림이 있는 곳(아마도 콘솔)으로 리디렉션된 다음 표준 출력 스트림이 file 로 리디렉션됩니다. 표준 오류 스트림은아니요이 파일로 리디렉션됩니다.

이것의 분명한 효과는 표준 오류에 의해 생성된 내용과 파일의 표준 출력에 의해 생성된 내용을 화면에서 볼 수 있다는 것입니다.

utility 2>&1 | tee output.log

여기서 표준 오류를 표준 출력 스트림과 동일한 위치로 리디렉션합니다. 이것은 의미한다둘 다tee스트림은 단일 혼합 출력 스트림으로 유틸리티 에 파이프되며 해당 stdout tee데이터는 tee콘솔에서도 재생산됩니다(이것이 바로 tee데이터 스트림을 복사하는 것입니다).

어느 것을 사용할지는 달성하려는 목표에 따라 다릅니다.

표준 출력 과 오류가 파일에 저장되는 것을 >결합하는 (as in)을 사용하여 두 번째 파이프의 효과를 재현 할 수 없다는 점에 유의하십시오 . 콘솔 및 출력 파일에서 데이터를 가져오려면 이를 사용해야 합니다 .utility >output.log 2>&1output.logtee


추가 참고 사항:

이것보이는첫 번째 명령의 효과,

utility 2>&1 >output.log 

동일할 것이다

utility >output.log

즉, 표준 출력은 파일로 이동하고 표준 오류는 콘솔로 이동합니다.

위의 각 명령 끝에 추가 처리 단계를 추가하면 큰 차이가 있습니다.

utility 2>&1 >output.log | more_stuff

utility >output.log      | more_stuff

첫 번째 파이프라인에서는 more_stuff초기 표준 오류 스트림을 표준 입력 데이터로 가져오지만 utility, 두 번째 파이프라인에서는 파이프를 통해 전송된 결과 표준 출력 스트림일 뿐이므로 more_stuff파이프라인의 일부는 아무것도 얻지 못합니다. 표준 읽기 입력.

답변2

첫 번째 명령은 다른 작업을 수행합니다.

뒤쪽에

2>&1 > output.log 

이전 STDOUT은 STDERR에 저장(복사)된 다음 STDOUT이 파일로 리디렉션됩니다.

따라서 stdout은 파일로 이동하고 stderr은 콘솔로 이동합니다.

그리고

 2>&1 | tee output.log

두 스트림 모두 티로 리디렉션됩니다. Tee는 모든 입력을 표준 출력(귀하의 경우 콘솔)과 파일( output.log)에 복사합니다.

첫 번째 형식에는 또 다른 형식이 있습니다.

    > output.log  2>&1

이렇게 하면 STDOUT 및 STDERR이 이 파일로 리디렉션됩니다.

답변3

전자는 파일로만 출력합니다. 두 번째는 둘 다 파일로 출력합니다.그리고화면에.

답변4

먼저 몇 가지 샘플 코드를 살펴보겠습니다.

#include <stdio.h>
main() 
{
// message 1, on stdout (using  printf)
printf("%s",          "message 1, on stdout (using  printf)\n");

// message 2, on stdout (using fprintf)
fprintf(stdout, "%s", "message 2, on stdout (using fprintf)\n");

// message 3, on stderr (using fprintf)
fprintf(stderr, "%s", "message 3, on stderr (using fprintf)\n");
}

결과를 비교해 보겠습니다.
./helloerror
+ 파일: 메시지 없음, 콘솔: 메시지 1, 2, 3;

./helloerror >error.txt
+ 파일: 메시지 1,2; 콘솔: 메시지 3;

./helloerror 2>&1 >error.txt
+ 파일: 메시지 1,2; 콘솔: 메시지 3
+ ./helloerror >error.txt와 동일

./helloerror >error.txt 2>&1
+ 파일: 메시지 3,1,2; 콘솔: 메시지 없음
+ 순서는 3, 그 다음 1, 2입니다.

./helloerror | tee error.txt 2>&1
+ 파일: 메시지 1,2; 콘솔: 메시지 3,1,2
+ 순서는 3, 그 다음 1, 2입니다.

./helloerror 2>&1 | tee error.txt
+ 파일: 메시지 3,1,2; 콘솔: 메시지 3,1,2;

지침:
./helloerror >error.txt 2>&1
-> 파일의 모든(stdout+stderr) 메시지를 원하지만콘솔에 고정되지 않음

./helloerror 2>&1 | tee error.txt
-> 파일의 모든(stdout+stderr) 메시지를 원하는 경우콘솔에 인쇄

관련 정보