안녕하세요. 이번 시간에는 /dev/null 2>&1의 의미를 알아보겠습니다. 이 글을 읽기 전에 파일 디스크립터와 dup2 함수 등에 대한 개념을 잡고 오시면 조금 더 편할 듯 싶습니다.

 

[관련글]

파일 디스크립터와 관련된 dup2 함수에 대해 알아봅시다.


 먼저 0, 1, 2는 표준 입력인 stdin, 표준 출력인 stdout, 에러 stderr를 뜻하는 것은 알고 계실 겁니다. 다 터미널과 연관이 되어 있습니다. 따로 파일 디스크립터가 다른 것을 가리키게 하지 않는 (dup2나 dup 등을 이용해서) 이상은요. 파일 디스크립터 (fd)는 프로세스마다 독립적으로 가지고 있는 자원 중 하나입니다.

 

 

 먼저, cat 2.txt는 2.txt의 내용을 출력해 줍니다. 만약에 없으면 No such file or directory를 출력합니다. 보니까, 2.txt가 없는 모양이군요.

 

 이제 >를 봅시다. cat 2.txt를 /dev/null로 redirect 합니다. 그런데, 여전히 No such file or directory가 뜨네요. 이건 또 어찌 된 영문일까요? 사실 이 명령어는, 아래와 같습니다.

 

 먼저 1번과 2번은 /dev/tty, 터미널을 보고 있어요. cat 2.txt를 하면 요래 보고 있습니다. 그런데, cat 2.txt > /dev/null을 하면, 1번이 /dev/null을 보게 됩니다.

 

 그림으로 보면 이렇게 되는 셈입니다. 즉, 1번으로 출력되는 것들은 모조리 /dev/null로 들어간다는 의미입니다. 이 디바이스 파일은, 출력을 버려버릴 때 자주 언급되는 파일이므로, 알아두시면 좋습니다.

 

 

 그 다음에 2>&1이 나오는데요. 문서에 나오는 i>&j입니다. 이것은 i번 파일 디스크립터를 j번으로 돌리라는 의미입니다.

 

 1번이 /dev/null을 가리키고 있으니, 2번도 /dev/null을 가리키게 됩니다. 즉, 그림으로 그리면 이렇게 됩니다. 2번으로 나오는 No such file or directory도 /dev/null로 리다이렉트가 되니, 터미널에 아무것도 출력되지 않아요. 정리하면, cat 2.txt > /dev/null 2 > &1의 의미는, cat 2.txt의 출력 결과도, 에러 내용도 /dev/null에 리다이렉션 시켜서 출력을 버리겠다는 의미입니다.

 


 반면에, cat 2.txt 2>&1 > /dev/null은 어떨까요?

 

 일단 이 명령어는 아래와 같이 해석이 됩니다.

 

 2번 STDERR가 STDOUT으로 redirect 된다. 그런데 1번 또한 /dev/tty이니, 출력하는 대상이 /dev/tty가 됩니다.

 

 

 다음에 > /dev/null이 나왔습니다.

 

 그러면 1번만 /dev/null로 리다이렉트가 됩니다. 2번 에러 내용은 /dev/tty로 출력되기 때문에 No such file 메세지를 터미널에서 볼 수 있습니다.