티스토리 뷰
발생일: 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번 표준 출력 파일 디스크립터가 참조하고 있는 곳으로 보낸다.
> : (표준 출력으로) 나오는 결과를 다음 파일로 보낸다.
/dev/null : 유닉스의 블랙홀과 같은 파일이다. 이 파일을 모든 출력을 흡수한다. (보이지 않는다.)
2> : 에러 메세지가 발생할 경우에는, 즉 에러 출력을,
&1 : 1번 표준 출력 파일 디스크립터가 참조하고 있는 곳으로 보낸다.
즉, 조회한 내용과 발생한 에러 모두 표시하지 않겠다는 뜻이었다.
#. 참고
- KLDP > I/O 재지향
- The Standard Unix Descriptor
- Cron: Difference Between > /dev/null 2>&1 and > /dev/null
- File Input/Output System Call Function
반응형
댓글
공지사항