0 views
1. 개념 및 정의
1.1 한 줄 요약
- "데이터의 흐름을 수도관(Pipe)처럼 연결하거나, 물줄기의 방향을 바꿔 양동이(File)에 담는 작업이다."
- Pipe (
|)- 호스와 호스를 연결하여 물(데이터)이 계속 흐르게 하는 것.
- Redirection (
>,>>****,<****)- 호스 끝의 물(데이터)을 화면이 아닌 파일(양동이)로 돌리거나, 반대로 파일의 내용을 프로그램에 주입하는 것.
- Pipe (
1.2 공식 정의
- 리눅스 셸 환경에서 표준 스트림의 흐름을 제어하는 메커니즘이다.
- Redirection (재지향)
- 표준 입력(stdin), 표준 출력(stdout), 표준 에러(stderr)의 입출력 대상을 화면(터미널)이나 키보드가 아닌 '파일'이나 '장치'로 변경하는 행위.
- Pipe (파이프)
- 한 프로세스의 표준 출력을 다른 프로세스의 표준 입력으로 직접 연결하는 IPC(Inter-Process Communication) 기법.
- Redirection (재지향)
2. 동작 원리
- 단순히 기호를 외우는 것이 아니라, 리눅스 커널이 이 기호들을 어떻게 처리하는지 이해해야 한다.
- 핵심은 파일 디스크립터(File Descriptor, FD)에 있다.
2.1. 표준 스트림과 파일 디스크립터
- 리눅스 운영체제는 모든 입출력을 파일로 간주하며, 실행 중인 프로세스는 기본적으로 3개의 파일 디스크립터를 할당받는다.
| FD 번호 | 이름 | 영문명 (Abbr.) | 기본 대상 | 설명 |
|---|---|---|---|---|
| 0 | 표준 입력 | stdin | 키보드 | 프로그램에 데이터를 입력받는 통로 |
| 1 | 표준 출력 | stdout | 모니터(터미널) | 정상적인 실행 결과를 출력하는 통로 |
| 2 | 표준 에러 | stderr | 모니터(터미널) | 오류 메시지를 출력하는 통로 |
2.2. Redirection의 내부 동작 (>, >>****)
- 사용자가
ls > result.txt를 실행하면 셸 내부에서는 다음과 같은 시스템 호출 과정이 일어난다.fork()- 셸이 새로운 자식 프로세스를 생성한다.
open()result.txt파일을 연다. (파일이 없으면 생성, 있으면 내용 삭제 후 열기)
dup2()- 기존의 FD 1(stdout)을 닫고, 방금 연
result.txt의 파일 디스크립터를 FD 1로 복제한다.
- 기존의 FD 1(stdout)을 닫고, 방금 연
exec()ls명령어를 실행한다.- 이때
ls는 평소처럼 FD 1에 결과를 쓰지만, FD 1이 화면이 아닌 파일로 바뀌어 있으므로 결과가 파일에 저장된다.
2.3. Pipe의 내부 동작 (|)
command A | command B를 실행하면 다음과 같이 작동한다.- 커널 영역에 파이프(버퍼)를 생성한다.
command A의 FD 1(stdout)을 파이프의 입구(Write end)에 연결한다.command B의 FD 0(stdin)을 파이프의 출구(Read end)에 연결한다.- A가 쓴 데이터는 디스크를 거치지 않고 메모리 버퍼를 통해 B로 즉시 전달된다.
참고: 파이프는 단방향 통신이며, 데이터는 FIFO(First In First Out) 구조로 흐른다.
3. 사용법 및 구문 (Syntax)
3.1. Redirection (파일 입출력 제어)
-
출력 방향 변경 (
>,>>****)-
>(Overwrite)- 명령의 결과를 파일에 저장한다.
- 기존 파일 내용은 삭제(덮어쓰기)된다.
-
>>(Append)- 명령의 결과를 파일 끝에 추가한다.
- 기존 내용은 보존된다.
# 1. 파일 덮어쓰기 (기존 내용 삭제됨) echo "Hello World" > hello.txt # 2. 파일 이어쓰기 (기존 내용 뒤에 추가됨) echo "Next Line" >> hello.txt
-
-
입력 방향 변경 (
<,<<****)<(Input Redirection)- 키보드 대신 파일의 내용을 명령어의 입력으로 사용한다.
<<(Here Document)- 셸 스크립트 내에서 여러 줄의 텍스트를 입력으로 전달할 때 사용한다.
# cat 명령어가 키보드 입력이 아닌 hello.txt 내용을 읽음
cat < hello.txt
# EOF를 만날 때까지 입력된 텍스트를 cat의 입력으로 전달
cat << EOF > script_msg.txt
This is line 1
This is line 2
EOF
3.2. Pipe (프로세스 연결)
|- 앞 명령어의 출력을 뒤 명령어의 입력으로 넘긴다.
# ps(프로세스 목록) 결과를 grep(검색)으로 넘겨 'python' 단어가 포함된 줄만 출력
ps aux | grep python
3.3. 파일 디스크립터 응용 (&, 2>****)
- 질문한
&는 단독으로 쓰일 때와 리다이렉션과 함께 쓰일 때 의미가 다르다.-
백그라운드 실행 (
&)-
명령어 뒤에 붙이면 터미널을 점유하지 않고 뒤에서 실행한다.
ping google.com &
-
-
에러 리다이렉션 (
2>)-
표준 에러(FD 2)만 따로 파일로 저장한다.
# 정상 결과는 화면에, 에러만 error.log에 저장 gcc main.c 2> error.log
-
-
표준 출력/에러 통합 (
2>&1,&>****):-
정상 결과와 에러를 한 곳으로 모은다.
2>&1: "FD 2번(에러)을 FD 1번(출력)이 가리키는 곳으로 보내라"는 의미다.
# stdout과 stderr 모두 debug.log에 저장 ./script.sh > debug.log 2>&1 # 위와 동일한 최신 문법 (Bash 4.0+) ./script.sh &> debug.log # 에러 메시지를 쓰레기통(/dev/null)으로 보내서 화면에 안 뜨게 함 find / -name "secret" 2> /dev/null
-
-
| 기호 | 명칭 (Name) | 기능 설명 (Description) | 사용 예시 |
|---|---|---|---|
| ` | ` | Pipe | 왼쪽 명령의 출력을 오른쪽 명령의 입력으로 전달한다. |
> | Output Redirection | ||
| (Overwrite) | 명령의 결과를 파일에 저장한다. (기존 내용 삭제) | ls > list.txt | |
>> | Output Redirection | ||
| (Append) | 명령의 결과를 파일 끝에 추가한다. (기존 내용 보존) | echo "End" >> log.txt | |
< | Input Redirection | 키보드 대신 파일의 내용을 명령의 입력으로 사용한다. | sort < data.txt |
2> | Error Redirection | 에러 메시지(stderr)만 따로 파일에 저장한다. | gcc main.c 2> error.log |
2>&1 | Merge Output | 에러(2)를 표준 출력(1)이 가리키는 곳으로 함께 보낸다. | command > all.log 2>&1 |
& | Background | 명령어를 백그라운드(뒷단)에서 실행한다. | sleep 100 & |
; | Separator | 앞 명령의 성공 여부와 관계없이 순차적으로 실행한다. | cd .. ; ls |
&& | Logical AND | 앞 명령이 성공(0)했을 때만 뒤 명령을 실행한다. | make && make install |
| ` | ` | Logical OR |
Loading comments...