본문 바로가기

OS/Unix, Linux

[OS/Unix, Linux] 표준 스트림 STDIN, STDOUT 그리고 STDERR

표준 스트림(Linux Standard Streams)

스트림(Stream)을 직역하면 물이 흐른다는 의미입니다. 컴퓨팅 시스템에서 스트림은 데이터의 흐름을 의미합니다. 이때 전송되는 데이터의 단위는 바이트입니다.

예를 들어 마우스, 키보드와 같은 입력 장치로부터 발생하는 신호의 흐름을 입력 스트림이라고 부르거나 프린터, 네트워크 인터페이스 디바이스와 같은 출력 장치로 전달되는 데이터의 흐름을 출력 스트림이라고 부를 수 있습니다. 사실 스트림은 좀 더 추상적이고 광범위한 범위에서 사용됩니다.

중요한 것은 데이터의 흐름은 시작과 끝이라는 두 점으로 구성된다는 사실입니다. 유닉스 계열의 운영체제에서는 컴퓨터와 프로그램 사이의 추상적인 입출력 통로를 만들고 이를 표준 스트림이라고 부릅니다. 유닉스에서 우리가 작성한 프로그램은 자동으로 세 가지 표준 스트림을 열게 됩니다.

  • 0, 표준 입력 스트림(STDIN)
    일반적으로는 쉘에서 키보드를 통한 명령어 입력에 대한 흐름
  • 1, 표준 출력 스트림(STDOUT)
    일반적으로는 쉘에서 명령어의 정상적인 처리 결과에 대한 흐름
  • 2, 표준 오류 스트림(STDERR)
    일반적으로는 쉘에서 명령어의 비정상적 처리 결과에 대한 흐름

리다이렉션(Redirection)

리다이렉션은 방향 표시 문자 '<'와 '>'를 사용한 스트림 방향 지정을 의미합니다. 리다이렉션을 이해하고 있으면 표준 스트림에 대한 간단한 테스트를 진행 할 수 있습니다.

  • >
    '명령어 > 파일' 방향으로 스트림을 지정합니다. 명령어 실행 결과가 파일에 작성-덮어쓰기됩니다.
  • >>
    '명령어 >> 파일' 방향으로 스트림을 지정합니다. 명령어 실행 결과가 파일에 이어 작성됩니다.
  • <
    '명령어 < 파일' 방향으로 스트림을 지정합니다.  파일의 내용으로부터 명령어를 입력합니다.

표준 출력 스트림(STDOUT)

ls는 현재 디렉토리의 파일 목록을 출력합니다. 이때 표준 출력 스트림에 대한 종착지는 쉘에 해당합니다.

$ ls
test

명령어의 표준 출력 스트림을 파일로 리다이렉션합니다.

$ [명령어] 1> [파일]

예시에서는 다음과 같이 사용됩니다.

$ ls 1> test2

명령어의 출력 결과는 파일에 작성됩니다.

$ cat test2
test
test2

STDOUT에 대한 파일 디스크립터 1은 리다이렉션에서 생략 될 수 있습니다.

$ ls > test2

리다이렉션 >은 파일을 덮어쓰기 때문에 반복 실행해도 파일 내용이 변하지 않습니다. 반면 리다이렉션 >>은 기존 파일에 출력 결과를 이어서 작성합니다.

$ ls 1> test2
$ cat test2
test
test2
$ ls 1>> test2
$ cat test2
test
test2
test
test2

표준 오류 스트림(STDERR)

쉘에서 명령어 실행 오류가 발생하면 표준 오류 스트림에 대한 종착이는 쉘에 해당합니다.

$ cat null.txt 2> test2
cat: null.txt: No such file or directory

명령어의 표준 오류 스트림을 파일로 리다이렉션합니다.

$ [명령어] 2> [파일]

예시에서는 다음과 같이 사용됩니다. 오류는 쉘에 출력되지 않고 파일에 작성됩니다.

$ cat null.txt 2> test2
$ cat test2
cat: null.txt: No such file or directory

/dev/null

유닉스 계열에서 특수한 목적에 의해 만들어진 가상 장치 중 하나입니다. 실제로는 null이라는 이름의 파일에 해당하며, 파일이 위치한 경로를 포함하여 /dev/null이라고 부릅니다.

$ ls -l /dev | grep null
crw-rw-rw-  1 root     wheel            3,   2  4  5 02:32 null

/dev/null 파일은 항상 비어있습니다. 이러한 특징으로 인해 표준 출력과 표준 오류를 버리는 목적으로 사용됩니다. 다음은 표준 출력의 스트림을 /dev/null로 리다이렉션하여 출력 결과를 제거합니다.

$ ls
test	test2
$ ls 1> /dev/null

표준 오류 역시 /dev/null로 리다이렉션 할 수 있습니다.

$ cat null.txt
cat: null.txt: No such file or directory
$ cat null.txt 2> /dev/null