Linux/Unix 환경에서는 커맨드라인에서 입출력 흐름을 제어할 수 있는 여러 방법이 존재한다. 그중에서도 리디렉션(redirection)과 파이프(pipe)는 데이터 흐름을 유연하게 제어하기 위한 핵심 기능이다.
리눅스는 기본적으로 세 가지 표준 스트림을 제공한다:
| 스트림 | 파일 디스크립터 | 설명 |
|---|---|---|
stdin | 0 | 표준 입력 (keyboard 등) |
stdout | 1 | 표준 출력 (screen 등) |
stderr | 2 | 표준 에러 출력 |
모든 프로세스는 실행될 때 기본적으로 이 세 개의 스트림과 연결된다.
리디렉션은 기본 입출력 대상(화면, 키보드 등)을 다른 파일이나 장치로 바꾸는 것이다.
stdout)$ echo "hello" > file.txt
"hello"를 file.txt에 덮어쓰기(overwrite) 함> 연산자는 stdout(1)을 파일로 리디렉션함$ echo "world" >> file.txt
>> 연산자는 추가(append) 방식으로 리디렉션stdin)$ wc < file.txt
file.txt의 내용을 표준 입력처럼 사용하여 wc 명령어에 전달stderr)$ ls nofile 2> error.log
error.log 파일로 보냄$ ls file nofile > out.txt 2>&1
1)과 에러(2)를 모두 out.txt에 저장2>&1은 "2번 출력도 1번 출력으로 리디렉션하라"는 의미파이프(|)는 한 명령어의 출력을 다른 명령어의 입력으로 연결하는 방식이다.
$ ls -l | grep ".c"
ls -l 결과 중 .c가 포함된 라인만 출력함|는 stdout → stdin으로 데이터를 연결함여러 명령어를 체인처럼 연결하여 처리 흐름을 구성할 수 있음
$ ps aux | grep python | awk '{print $2}'
tee는 출력을 파일에 저장하면서 동시에 화면에도 출력하는 명령어다.
$ ls -al | tee log.txt
ls -al 결과를 log.txt에 저장하면서 동시에 터미널에 출력함$ cat app.log | grep ERROR > error.log
app.log 중 ERROR가 포함된 줄만 필터링해서 error.log에 저장$ date | tee now.txt
| 기능 | 설명 | |
|---|---|---|
> | 표준 출력을 덮어쓰기 방식으로 리디렉션 | |
>> | 표준 출력을 추가 방식으로 리디렉션 | |
< | 표준 입력을 파일로부터 받음 | |
2> | 에러 출력을 파일로 리디렉션 | |
2>&1 | 에러 출력도 표준 출력과 같은 곳으로 리디렉션 | |
| ` | ` | 출력 → 입력으로 이어주는 파이프 |
tee | 출력을 파일과 화면에 동시에 출력 |