다음 두 명령의 차이점을 알고 싶습니다
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>&1
output.log
tee
추가 참고 사항:
이것보이는첫 번째 명령의 효과,
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) 메시지를 원하는 경우콘솔에 인쇄