Overview
Linux에서 stdin, stdout 및 stderr은 터미널 또는 명령줄 인터페이스에서 입력 및 출력을 관리하는 데 사용되는 표준 데이터 스트림이다. 다음은 이러한 작동 방식과 상호 작용할 수 있는 방법에 대한 자세한 내용이다.
표준입력(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과 별도로 리디렉션될 수 있다.
이러한 스트림과 리디렉션을 이해하면 특히 스크립트와 자동화된 프로세스에서 입력과 출력을 보다 효과적으로 제어하는 데 도움이 된다.
Reference
https://ko.wikipedia.org/wiki/%ED%91%9C%EC%A4%80_%EC%8A%A4%ED%8A%B8%EB%A6%BC
'CS 지식' 카테고리의 다른 글
[CS 지식17.] IPsec vs SSL/TLS (0) | 2024.11.11 |
---|---|
[CS 지식15.] SSR vs CSR vs ISR vs SSG (6) | 2024.09.05 |
[CS 지식14.] 3tier 아키텍처란? (2) | 2024.06.10 |
[CS 지식13.] 동기 및 비동기 처리란? (0) | 2024.06.06 |
[CS 지식12.] SSO(Single Sign-On)란? (With OAuth SAML OIDC) (0) | 2024.03.23 |