it-swarm-ko.tech

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

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

2>&1 > output.log 

2>&1 | tee output.log

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

36
Chander Shivdasani

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

utility 2>&1 >output.log 

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

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

utility 2>&1 | tee output.log

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

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

>에서와 같이 utility >output.log 2>&1만으로 두 번째 파이프 라인의 효과를 재현 할 수 없습니다. 표준 출력을 먼저 표준 출력으로 리디렉션하여 파일에 표준 출력과 오류를 모두 저장합니다. output.log 파일로 이동 한 다음 표준 오류를 표준 출력이 진행되는 위치로 리디렉션합니다. 콘솔과 출력 파일에서 데이터를 가져 오려면 tee을 사용해야합니다.


추가 사항 :

첫 번째 명령의 visible 효과

utility 2>&1 >output.log 

~와 같을 것이다

utility >output.log

즉, 표준 출력은 파일로 가고 표준 오류는 콘솔로갑니다.

위의 각 명령 끝에 추가 처리 단계가 추가 된 경우 다음과 같이 큰 차이가 있습니다.

utility 2>&1 >output.log | more_stuff

utility >output.log      | more_stuff

첫 번째 파이프 라인에서 more_stuffutility에서 표준 입력 데이터로 원래 표준 오류 스트림을 가져 오는 반면, 두 번째 파이프 라인에서는 파이프를 통해 전송되는 결과 표준 출력 스트림이므로 파이프 라인의 more_stuff 부분은 표준 입력에서 읽을 내용이 없습니다.

15
Kusalananda

편집 메모

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


원래 답변

2>&1 >output.log는 먼저 모든 파일 핸들 2 항목 (표준 오류)을 파일 핸들 1 (표준 출력) then 파일 output.log로 보내기 시작 함을 의미합니다. 즉, 표준 오류 및 표준 출력을 로그 파일로 보냅니다.

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

결론은 첫 번째 파일은 파일에 stderr/stdout를 보내고 두 번째 파일은 both 파일과 표준 출력 (= 아마 표준 출력을 재 지정한 다른 구문 안에 있지 않는 한 터미널).

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

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

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

24
user14408

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

2>&1 > output.log 

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

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

그리고

 2>&1 | tee output.log

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

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

    > output.log  2>&1

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

8
osgx

전자는 파일로만 출력합니다. 두 번째는 파일 and를 화면으로 출력합니다.

4
André Caron

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

4
Arcege

먼저 샘플 코드를 보자 :

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

0
Hari Perev