# 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
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
'프로그래밍 > Linux' 카테고리의 다른 글
[Linux] 자바 버전 변경하기 (0) | 2022.07.24 |
---|---|
Linux 날짜 기준으로 오래된 파일 삭제하기 (0) | 2022.07.21 |
현재 컴퓨터에서 LISTEN 중인 포트 스캔하기 (0) | 2022.04.05 |
[Windows] WSL 종료 명령어 (0) | 2022.02.22 |
WSL에서 root 암호 분실시 비밀번호 재설정 방법 (0) | 2022.02.13 |