유닉스 파일 디스크립터 : > /dev/null 2>&1

발생일: 2011.09.19

문제:
유닉스 가이드를 읽던 중 아래와 같은 예제 구문이 나왔다.

$cat notexist > /dev/null 2>&1

저 /dev/null 2>&1 형태는 예전에 크론탭 동작하는 쉘에서도 언뜻 본 기억이 있는데,..
정확히 무슨 뜻일까?
 

해결책:
위 구문을 이해하기 위해 일단 유닉스의 파일 디스크립터(File Descriptor)에 대해 알아보자.

유닉스 프로그램이 파일에 뭔가 작업을 하기 위해서는 일단 파일을 열어야 한다.
이 때, 유닉스는 열려있는 파일을 구분하기 위해 파일에 간단한 숫자를 붙인다.
이 숫자를 파일 디스크립터라고 하고, 0부터 9까지 존재한다.

유닉스 프로그램은 기본적으로 아래 3개의 "파일"을 열어둔다.
- Standard Input (표준 입력, STDIN, 키보드)
- Standard Output (표준 출력, STDOUT, 스크린)
- Standard Error (표준 에러, STDERR, 스크린에 뿌려질 에러 메세지)

열려있는 표준 파일은 구분을 위해 숫자(파일 디스크립터)를 할당받으며, 각각 아래와 같다.
STDIN = 0, STDOUT = 1, STDERR = 2

0, 1, 2 외의 파일 디스크립터(3~9)는 추가로 열리는 다른 파일을 구분하기 위해 사용된다.


리다이렉션(redirection, 재지향)은 열려있는 파일의 입출력을 다른 파일로 변활할 때 사용된다.
리다이렉터는 ">"로 나타내며, 쉽게, "모든 출력은 꺽쇠의 방향으로!" 라고 이해하면 된다. 
 

라다이렉터는 파일 디스크립터와 함께 사용될 수 있으며, 몇 가지 예를 들면 아래와 같다.

  > file
      표준 출력을 파일로 보낸다.
  1> file
      위와 동일하다. > 앞의 1은 표준 출력에 대한 파일 디스크립터를 나타낸다. 
  2> file 
      에러 출력을 file 로 보낸다.
  < file
      file로부터 표준 입력을 받는다.
  0< file
      위와 동일하다. < 앞의 0은 표준 입력 파일 디스크립터를 나타낸다.
  i>&j
      
i번 파일 디스크립터를 j번 파일 디스크립터로 리다이렉트한다.
      즉, i가 가리키는 파일의 모든 출력은 j가 가리키는 파일로 보낸다. 


따라서, 위 문제점에서의 구문은 아래와 같은 형태로 정리될 수 있다.
$cat notexist > /dev/null 2>&1

cat notexist : notexist 파일의 내용을 조회해서,
: (표준 출력으로) 나오는 결과를 다음 파일로 보낸다.
/dev/null
: 유닉스의 블랙홀과 같은 파일이다. 이 파일을 모든 출력을 흡수한다. (보이지 않는다.)
2> : 에러 메세지가 발생할 경우에는, 즉 에러 출력을,
&1 : 1번 표준 출력 파일 디스크립터가 참조하고 있는 곳으로 보낸다.

즉, 조회한 내용과 발생한 에러 모두 표시하지 않겠다는 뜻이었다.
 

 
저작자 표시 비영리 변경 금지
신고

카테고리

분류 전체보기 (682)
About me. (6)
Daylogs (647)
비공개 (0)
영어공부 (0)
My works - 추억 (29)