프로그래밍/Linux

2 > &1의 진짜 뜻

Lou Park 2022. 6. 6. 18:21

# stdin, stdout, stderr

"2>&1"를 알아보기전에 이들이 무엇인지 먼저 알아보아야한다. 표준입력(stdin), 표준출력(stdout), 표준에러(stderr)는 unix 커맨드를 실행할때 생성되는 3가지 데이터 스트림(data stream)이다. 스트림은 데이터를 전송할 수 있는 어떤 것인데, 여기서 세 데이터 스트림이 전송하는 데이터는 텍스트(text)다. 

 

# File Descriptor

알다시피, unix의 모든 것은 파일이다. 위 표준입/출력/에러 3가지도 unix에겐 파일인데, 프로세스가 열려있는 파일들을 관리하고 이 파일들에 접근하도록 하기 위해서 파일 디스크립터(File Descriptor)라는 추상 개념을 이용하게된다. 이름은 숫자가 아닐것처럼 생겼지만, 파일 디스크립터는 "음수 0이 아닌 정수값"인 숫자다. 표준입출력/에러 삼형제는 모든 프로세스 실행시 기본적으로 할당되는 파일 디스크립터들이다. 프로세스가 열리자마자 할당된 이들에겐 0, 1, 2라는 번호가 부여된다. 

  • 0:  stdin
  • 1: stdout
  • 2: stderr

이제야 2>&1의 비밀이 풀려가는 것만 같다. 

 

# &은 뭐죠?

입출력 스트림을 다루고 활용하는데 Pipe(|)나 Redirect (>) Append(>>)같은 연산자들을 사용한다. ">"는 정확한 명칭으로는 Output redirection operator로, 표준출력을 다른 파일로 옮기는 연산자다. 그러면 에러만 따로 로그로 모을때는 2 > error.log라는 식으로 쓸 수 있다. "그래 이해했어!" 표준에러를 표준 출력으로 바꿔서 하나의 로그파일에 담는거네! 2 > 1로 쓰려고하면 정말 1이라는 파일에 표준 에러가 담긴다.

 

command를 이용한 표준 출력은 file에 담기고, 표준 에러는 표준 출력에 복제된다. 따라서 모든 스트림이 file로 귀결된다. 이 과정을 보여주는 좋은 그림이있어서 가져왔다.

command >file 2>&1

 

원래 상태
command > file
command > file 2>&1

Redirection operator 사용법

아래는 용법 공식이다. &> [filename]은 표준 출력/에러를 filename에 담게되어 filename > 2>&1 의 간단한 표현으로 사용할 수 있다. 파일이름과 파일디스크립터를 구분하기 위해 &를 썼다고 이해하면 될 것 같다.

  • [file descriptor] > [filename]
  • [file descriptor] >& [file descriptor]
  • &> [filename]

이제 모두 2>&1를 완벽하게 이해했을 것같다. 자료를 찾다가 정말 괜찮은 사이트가 있어서 공유하고 마치겠다!

https://catonmat.net/bash-one-liners-explained-part-three

 

 

참고자료

http://itnovice1.blogspot.com/2019/08/linux-file-descriptor.html

https://www.baeldung.com/linux/pipes-redirection

https://www.howtogeek.com/435903/what-are-stdin-stdout-and-stderr-on-linux/#:~:text=The%20Linux%20Standard%20Streams&text=Text%20output%20from%20the%20command,and%20one%20input%20stream%2C%20stdin%20.