CS 지식

[CS 지식16.] stdin(표준입력) vs stdout(표준출력) vs stderr(표준에러)

Somaz 2024. 11. 9. 14:56
728x90
반응형

Overview

리눅스에서 `stdin`, `stdout`, `stderr` 는 프로세스와 셸 간 입출력 흐름을 제어하는 핵심 개념이다.

  • `stdin` 은 입력(예: 키보드, 파일),
  • `stdout` 은 일반 출력(예: 명령 실행 결과),
  • `stderr` 는 오류 메시지 출력을 위한 스트림입니다.

 

이 세 가지 표준 스트림은 파일 디스크립터(0, 1, 2) 로도 표현되며, 명령어 리디렉션(`>`, `2>`, `<`)이나 파이프(`|`), `tee`, 그리고 다양한 스크립트 로직과 결합되어 입출력 흐름을 세밀하게 제어할 수 있게 해준다.

 

 

이를 명확히 이해하면 CLI 환경에서의 자동화, 디버깅, 리포트 생성, 로그 관리 등에 있어서 훨씬 유리해진다.

 

 

 

출처 : https://ko.wikipedia.org/wiki/%ED%91%9C%EC%A4%80_%EC%8A%A4%ED%8A%B8%EB%A6%BC

 

 

 

 

📅 관련 글

2023.01.13 - [CS 지식] - [CS 지식1.] 웹 브라우저의 동작원리

2023.02.23 - [CS 지식] - [CS 지식2.] DNS의 동작원리(Domain Name System)

2023.03.06 - [CS 지식] - [CS 지식3.] HTTP / HTTPS 란?

2023.03.07 - [CS 지식] - [CS 지식4.] OSI 7계층 & TCP/IP 4계층이란?

2023.03.17 - [CS 지식] - [CS 지식5.] 가상화란?

2023.05.24 - [CS 지식] - [CS 지식6.] HTTP 메서드(Method)란? / HTTP Status Code

2023.12.05 - [CS 지식] - [CS 지식7.] Kubernetes 구성요소와 Pod 생성 방식이란?

2023.12.19 - [CS 지식] - [CS 지식8.] 프로세스(Process)와 스레드(Thread)란?

2023.12.30 - [CS 지식] - [CS 지식9.] 클라우드 컴퓨팅이란?(Public & Private Cloud / IaaS SaaS PaaS / Multitenancy)

2024.01.05 - [CS 지식] - [CS 지식10.] 웹1.0(Web1.0) vs 웹2.0(Web2.0) vs 웹3.0(Web3.0)

2024.02.02 - [CS 지식] - [CS 지식11.] NAT(Network Address Translation)란?

2024.05.22 - [CS 지식] - [CS 지식13.] 동기 및 비동기 처리란?

2024.05.23 - [CS 지식] - [CS 지식14.] 3tier 아키텍처란?

2024.08.28 - [CS 지식] - [CS 지식15.] SSR vs CSR vs ISR vs SSG

2024.11.09 - [CS 지식] - [CS 지식16.] stdin(표준입력) vs stdout(표준출력) vs stderr(표준에러)

2024.11.11 - [CS 지식] - [CS 지식17.] IPsec vs SSL/TLS

2024.11.22 - [CS 지식] - [CS 지식18.] Quantum Computing(양자 컴퓨팅)

 

 

 

 

 

 


 

 

 

표준입력(stdin)이란?

`stdin` 은 표준입력 또는 파일 디스크립터 0으로 표현된다.

파일이나 다른 명령과 같은 사용자 또는 다른 소스의 입력을 읽는다. 기본적으로 `stdin` 은 키보드에 연결되어 있지만 파일이나 다른 소스에서 리디렉션할 수 있다.

 

 

예시는 다음과 같다.

cat
  • 인수 없이 `cat` 을 입력하면 `stdin(입력 대기)` 에서 읽는다.
  • 어떤 텍스트라도 입력할 수 있으며, `cat` 은 해당 내용을 한 줄씩 다시 표시한다.

 

 

 

파일에서 `stdin` 을 리디렉션할 수도 있다.

cat < file.txt
  • 여기서 `cat` 은 `stdin` 을 통해 `file.txt` 의 내용을 읽어 `stdout(화면)` 에 출력한다.

 

 

 

 


 

 

 

 

 

 

표준출력(stdout)이란?

`stdout` 은 표준출력 또는 파일 디스크립터 1로 표현된다.

결과나 메시지를 터미널 화면으로 보내기 위한 기본 출력 스트림이다. 대부분의 명령은 결과를 `stdout` 으로 출력한다.

 

 

예시는 다음과 같다.

echo "Hello, World!"
  • `echo` 는 `stdout(화면)` 에 "Hello World"를 출력한다.

 

 

 

`stdout` 을 파일로 리디렉션 할 수 있다.

echo "Hello, World!" > output.txt
  • 여기서 `stdout` 은 `output.txt` 로 리디렉션된다. "Hello, World!"라는 텍스트 화면에 표시되지 않고 파일에 저장된다.

 

 

 

 


 

 

 

 

 

 

 

표준오류(stderr)이란?

`stderr` 는 표준오류 또는 파일 디스크립터 2로 표현된다.

오류 메시지의 기본 스트림이다. 기본적으로 stderr은 stdout과 마찬가지로 터미널 화면에 표시되지만 별도로 리디렉션될 수 있다.

 

 

실행중인 `sterr` 의 예는 다음과 같다.

ls /nonexistent-directory
  • 이 명령은 존재하지 않는 디렉터리를 나열하려고 시도한다. 오류 메시지(e.g., "ls: cannot access '/nonexistent-directory': No such file or directory”)가 `stderr` 로 전송된다.

 

 

 

`stderr` 을 파일로 리디렉션 해본다.

ls /nonexistent-directory 2> error.log
  • 여기서 `2>` 는 `stderr(표준오류)` 을 `error.log` 로 리디렉션하는 데 사용된다.

 

 

 

 


 

 

 

 

 

 

 

stdout 과 stderr 활용

다음 구문을 사용하면 `stdout` 과 `stderr` 을 모두 동일한 파일로 리디렉션할 수 있다.

ls /nonexistent-directory /etc  > all_output.log 2>&1
  • `2>&1` 은 `stderr` 을 `stdout` 과 같은 위치로 보내도록 쉘에 지시하므로 표준 출력과 오류 메시지가 모두 `all_output.log`에 기록된다.

 

 

 

출력을 인쇄하고 오류를 생성하는 스크립트 `(myscript.sh)` 가 있다고 가정한다. `stdout` 과 `stderr` 을 다음과 같이 두 개의 파일로 분리할 수 있다.

./myscript.sh > output.log 2> error.log
  • `output.log` 에는 표준 출력만 포함되고 `error.log` 에는 오류 메시지만 포함된다.

 

 

 

`tee` 명령을 사용하여 화면에 출력을 표시하면서 출력을 파일로 저장할 수 있다.

ls /etc | tee output.log
  • `tee` 는 `stdout` 을 화면과 `output.log` 모두에 보낸다.

 

 

 

 

Summary of Common Redirection Operations

Operation Explanation
command > file Redirect stdout to file.
command 2> file Redirect stderr to file.
command > file 2>&1 Redirect both stdout and stderr to file.
command < file Use file as stdin for command.
command >> file Append stdout to file instead of overwriting.
command 2>> file Append stderr to file.
command > file1 2> file2 Redirect stdout to file1 and stderr to file2.

 

 

 

요약

  • stdin (0): 일반적으로 키보드에서 입력을 읽지만 리디렉션될 수 있다.
  • stdout (1): 일반적으로 화면으로 출력을 보내지만 리디렉션될 수 있다.
  • stderr (2): 일반적으로 화면에 오류 메시지를 보내지만 stdout과 별도로 리디렉션될 수 있다.

 

이러한 스트림과 리디렉션을 이해하면 특히 스크립트와 자동화된 프로세스에서 입력과 출력을 보다 효과적으로 제어하는 데 도움이 된다.

 

 

 

 

 


 

 

 

 

 

 

stdin/stdout/stderr, 더 깊게 이해하고 싶다면?

표준 입출력 개념은 단순한 명령어 리디렉션을 넘어, 실제 현업에서도 자주 쓰이는 스크립트 작성, 로그 관리, 자동화 파이프라인 등과 직결된다. 다음의 고급 활용 사례들을 익혀두면, 더욱 탄탄한 쉘 스킬을 쌓을 수 있다.

 

 

 

표준 스트림과 파일 디스크립터 관계

  • 모든 Unix 기반 시스템에서는 파일 디스크립터(FD) 라는 번호로 표준 스트림을 다룬다.
    • `0`: `stdin` (입력)
    • `1`: `stdout` (출력)
    • `2`: `stderr` (에러)

 

  • 이는 C, Bash, Python 등 거의 모든 언어의 IO 기반이 되며, 리디렉션(`>`, `2>`, `<`, `2>&1`)의 동작 원리이기도 합니다.

 

 

 

Here Document (`<<EOF`) 사용법

  • 쉘에서 여러 줄의 문자열을 표준입력처럼 전달할 때 사용하는 기법이다.
  • 예시
cat <<EOF > test.txt
Hello, stdin!
Multiple lines
EOF
  • `EOF` 구간 내의 문자열은 모두 `stdin` 으로 입력되며, 텍스트 파일 없이도 동적인 입력이 가능하다.

 

 

 

`tee` 명령 실전 예제

  • 표준출력을 화면에 출력하면서 동시에 파일에도 저장하는 도구이다.
ls -al | tee result.log

 

 

실전에서는 다음처럼 다른 명령과 결합하여 사용된다.

curl -s https://example.com | grep "title" | tee titles.log
  • 로그 확인, 중간 결과 저장, 파이프라인 디버깅에 매우 유용하다.

 

 

 

 

Python과 C에서의 stdin/stdout 비교

  • Python 기본
name = input()              # stdin
print("Hello", name)        # stdout

 

 

 

고급 사용 (파일 기반 리디렉션)

import sys
sys.stdin = open("input.txt", "r")
sys.stdout = open("output.txt", "w")

 

 

 

C언어에서는 다음처럼 사용된다.

fprintf(stdout, "출력 메시지\n");
fprintf(stderr, "에러 메시지\n");

 

 

 

 

파일 디스크립터 복제와 고급 리디렉션

  • FD 복제는 `exec` 명령어로 가능
exec 3>&1                  # FD 3번을 stdout으로 복제
command 2>&3 | tee log.txt  # stderr을 FD 3(=stdout)으로 리디렉션

 

  • 이런 방식은 표준 출력과 에러를 분리하거나 통합할 때 유용하다.

 

 

 

stderr 로그 분리 실전 예제

  • 실무 스크립트에서는 로그와 에러를 따로 관리해야 할 경우가 많다.
./build.sh > build.log 2> error.log

 

  • `build.log`: 정상 출력 (컴파일 로그)
  • `error.log`: 경고 및 에러만 수집 (분석 및 경고 추적에 유리)

 

 

 

 

💡 위와 같은 고급 입출력 제어는 자동화 스크립트, CI/CD 파이프라인, 배포 로그 관리, 모니터링까지도 연계될 수 있는 중요한 스킬이다. 단순한 리디렉션을 넘어서 어떻게 입출력을 분리하고 활용할지 고민해보는 것이 숙련자의 단계로 가는 지름길이다.

 

 

 

 

 

 


 

 

 

 

실습 예제로 익히는 `stdin` / `stdout` / `stderr`

 

표준 입출력 개념을 완전히 내 것으로 만들기 위해선, 직접 손으로 입력하고 동작을 확인하는 것이 가장 빠른 길이다.

아래 실습 예제들을 터미널에서 직접 따라 해보세요!

 

 

 

1. `stdin`, `stdout`, `stderr` 동시 확인 (Bash)

#!/bin/bash
# sample_io.sh

echo "표준출력입니다."            # stdout (1)
echo "표준에러입니다." >&2       # stderr (2)

read -p "입력을 받습니다: " input  # stdin (0)
echo "입력받은 내용: $input"
bash sample_io.sh > out.log 2> err.log
cat out.log    # => 표준 출력 확인
cat err.log    # => 표준 에러 확인

 

 

 

 

2. Here Document + `cat` 조합 실습

cat <<EOF > poem.txt
Roses are red,
Violets are blue,
stdin은 신기하고,
쉘 스크립트는 멋져요.
EOF
cat < poem.txt   # stdin 리디렉션 활용

 

 

 

 

3. `tee ` 실전 로그 백업

ls -al /etc | tee etc_contents.log
# 화면에도 출력되고 etc_contents.log에도 저장됨

 

 

 

 

4. 표준 출력과 에러를 파일로 분리 저장

ls /etc /not-a-dir > success.log 2> fail.log

 

cat success.log   # => 정상 경로 출력
cat fail.log      # => 에러 메시지 출력

 

 

 

 

5. Python에서 `sys.stdin`, `sys.stdout`  제어

 

 

`input.txt`

파이썬 입력 테스트입니다.

 

 

 

`script.py`

import sys

sys.stdin = open("input.txt", "r")
sys.stdout = open("output.txt", "w")

user_input = input()
print("입력 받은 값:", user_input)
python3 script.py
cat output.txt
# => 입력 받은 값: 파이썬 입력 테스트입니다.

 

 

 

6. `exec` + FD 복제 응용

exec 3>&1
echo "표준 출력" > /dev/null
echo "에러 출력" >&2
echo "에러 출력" 2>&3 | tee debug.log

 

  • `exec 3>&1` → `stdout` 을 FD 3번으로 복제
  • `2>&3` → `stderr` 을 복제한 FD로 전달

 

 

 

 

7. CI/CD용 빌드 로그 & 에러 분리 예시

 

 

`build.sh`

#!/bin/bash
echo "빌드 시작"
mkdir temp_dir
rm -rf no_such_dir  # 오류 발생
echo "빌드 완료"

 

 

 

실행

bash build.sh > build.log 2> build_error.log
cat build.log         # => 빌드 로그
cat build_error.log   # => 에러만 따로 추출됨

 

 

 

🔚 마무리 Tip

  • 실습 시 `cat`, `echo`, `ls`, `read` 등 기본 명령어로도 입출력 흐름을 충분히 실험해볼 수 있다.
  • 다양한 조합을 시도해보며 `>`, `>>`, `2>`, `2>>`, `&>, tee`, `<<EOF` 를 자유자재로 다룰 수 있도록 연습해보자.

 

💡 진짜 현업에서는 "출력과 에러를 어디에, 얼마나 분리 저장하느냐"가 로그 관리와 디버깅의 핵심이다. 이 모든 입출력 흐름 제어 기술은 곧 자동화 스크립트의 기반이자, 운영을 안정시키는 무기이다!

 

 

 

 

 

 


 

 

 

 

 

마무리

표준 스트림 `stdin, stdout, stderr` 는 단순한 입출력 흐름 그 이상이다.

  • 스크립트 로깅,
  • 백그라운드 작업에서 에러 추적,
  • 파이프라인 연결,
  • 자동화된 테스트 등 다양한 분야에서 필수적인 기초 도구 역할을 하며,

 

특히 `2>`, `2>&1`, `tee`, `<<EOF`, `|`  등의 리디렉션/파이프 기술은 현업에서도 자주 사용되는 핵심 기술입니다.

이해하고 잘 활용한다면, 복잡한 작업도 간결하게 해결할 수 있는 강력한 무기가 된다.

 

 

 

 

 

 

 

 

 


Reference

 

제목 설명
표준 스트림 - Wikipedia `stdin, stdout, stderr` 의 개념 및 정의
Bash 리디렉션 설명 - GNU Manual Bash에서 리디렉션(`>, <, 2>, &>, <<`)의 모든 문법
Linuxize - Linux I/O Redirection `stdout, stderr` 리디렉션 실전 예시 위주 설명
tldp.org - Advanced Bash Scripting Guide 고급 리디렉션 및 파일 디스크립터 응용 (`exec`, FD 복제 등)
man bash (redirection section) 공식 매뉴얼에서 리디렉션 관련 섹션 (검색: REDIRECTION)
Python sys.stdin / sys.stdout Docs Python에서 `stdin/stdout/stderr` 다루기
Here Documents in Bash Here Document(`<<EOF`) 실전 활용법

 

 

 

 

 

728x90
반응형