[unix] 2> & 1> output.log와 2> & 1 |의 차이점 | 티 output.log

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

2>&1 > output.log 

2>&1 | tee output.log

동료 중 하나가 두 번째 옵션을 사용하여 리디렉션하는 것을 보았습니다. 나는 2> & 1이 무엇을하고 있는지, 나의 유일한 질문은 간단한 리디렉션 “>”연산자를 사용할 수있는 티를 사용하는 목적이 무엇인가?



답변

두 명령을 개별적으로 살펴보십시오.

utility 2>&1 >output.log 

여기서 리디렉션은 왼쪽에서 오른쪽으로 처리되기 때문에 표준 오류 스트림은 표준 출력 스트림이있는 곳 (콘솔로)으로 리디렉션 된 다음 표준 출력 스트림이 파일로 리디렉션됩니다. 표준 오류 스트림은 해당 파일로 리디렉션 되지 않습니다 .

이것의 가시적 인 효과는 화면의 표준 오류에서 생성 된 것과 파일의 표준 출력에서 ​​생성 된 것을 얻는 것입니다.

utility 2>&1 | tee output.log

여기서 표준 오류를 표준 출력 스트림과 같은 위치로 리디렉션합니다. 이것은 스트림이 tee하나의 통합 된 출력 스트림으로 유틸리티에 파이프 되고이 표준 출력 데이터가에 의해 지정된 파일에 저장됨을 의미 tee합니다. tee콘솔에서 데이터가 추가로 재생산됩니다 (이것이 tee데이터 스트림을 복제 함).

이 중 어느 것이 사용되는지는 달성하고자하는 것에 달려 있습니다.

두 번째 파이프 라인의 효과 는 파일에서 표준 출력과 오류를 모두 저장하는 >(와 같이) 두 번째 파이프 라인의 효과를 재현 할 수 없습니다 utility >output.log 2>&1. 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파이프 라인 의 일부는 아무것도 얻지 못합니다. 표준 입력을 읽습니다.


답변

편집 메모

이 답변에 대한 의견을 반드시 읽으십시오derobert .


원래 답변

2>&1 >output.log는 먼저 모든 파일 핸들 2 항목 (표준 오류)을 파일 핸들 1 (표준 출력) 보낸 다음 파일 보냅니다 output.log. 즉, 표준 오류 및 표준 출력을 로그 파일로 보냅니다.

2>&1 | tee output.log2>&1비트 와 동일하며 표준 출력과 표준 오류를 표준 출력 스트림에 결합합니다. 그 후, 그 파이프 관통 tee(같은 표준 출력을 표준 입력을 보낼 프로그램 cat)과 같은 파일로. 따라서 두 스트림 (오류 및 출력)을 결합한 다음이를 터미널과 파일로 출력합니다.

결론은 첫 번째 전송하는 것입니다 stderr/ stdout두 번째로 전송하는 동안, 파일에 모두 파일 및입니다 (표준 출력 아마 당신은 표준 출력을 리디렉션 한 다른 구조 내부 아니라면 터미널).

마지막 가능성은 다음과 같습니다.

(echo hello | tee xyzzy.txt) >plugh.txt

터미널에서 아무것도 끝나지 않습니다.


답변

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

2>&1 > output.log 

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

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

그리고

 2>&1 | tee output.log

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

그리고 또 다른 형태의 첫 번째가 있습니다.

    > output.log  2>&1

STDOUT 및 STDERR이 파일로 경로 재 지정됩니다.


답변

전자는 파일로만 출력합니다. 두 번째는 파일 화면 모두에 출력 됩니다.


답변

그 이유 2>&1 | tee는 stdout과 stderr을 로그 파일로 캡처하고 동시에 화면에서 볼 수 있기 때문입니다. 이 작업도 수행 할 수 >output.txt 2>&1 & tail -f있지만 백그라운드 명령이 언제 종료되었는지 알 수 없습니다. 프로그램이 종료되었거나 출력없이 실행되고 있습니다. 는 2>&1 | tee프로그래머를위한 공통 관용구이었다.


답변

샘플 코드를 먼저 보자.

#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) 메시지를 원하고 콘솔에 인쇄 하려는 경우


답변

다음은 Unix 출력 스트림을 요약 한 게시물입니다. http://www.devcodenote.com/2015/04/unix-output-streams.html

게시물의 스 니펫 :

3 가지 표준 출력 스트림이 있습니다.

STDIN - Standard Input - Writes from an input device to the program
STDOUT - Standard Output - Writes program output to screen unless specified otherwise.
STDERR - Standard Error Output - Writes error messages. Also printed to the screen unless specified otherwise.