---
description: 파이프와의 차이점은, 표준입력과 표준출력을 넘겨주는(변경하는) 대상이 프로세스가 아니라 파일(file)이라는 것 뿐이다.
---

# \[minishell] 6. 리다이렉션(Redirection) 처리

> 리다이렉션 처리를 이해하려면 앞의 글 [파이프 처리](https://velog.io/@hidaehyunlee/minishell-5.-%ED%8C%8C%EC%9D%B4%ED%94%84Pipe-%EC%B2%98%EB%A6%AC)에서 정리했던 `dup2` 함수에 대한 이해가 필요합니다.

## 1. 리다이렉션 기호

* `command > file` : 표준출력을 파일에 덮어쓰거나(overwrite) 파일이 없다면 새로 생성함
  * dup2(fd, 1)
* `command < file` : 파일의 데이터를 명령어의 표준입력(input)으로 넘김
  * dup2(fd, 0)
* `command >> file` : 표준출력을 파일에 개행문자 후 덧붙이거나(append) 파일이 없다면 새로 생성함

## 2. 리다이렉션 핵심

파이프에서 배웠던 `dup2(fd1, fd2)` 함수가 리다이렉션에서에서도 중요하다. 파이프와의 차이점은, **표준입력과 표준출력을 넘겨주는 대상이 프로세스가 아니라 파일(file)**&#xC774;라는 것 뿐이다.

```c
dup2(in_fd, 0) //표준입력을 in_fd가 가리키는 파일로 대체
dup2(out_fd, 1) //표준출력을 out_fd가 가리키는 파일로 대체 => 이후로 모든 표준출력 결과가 가리키는 파일에 기록된다.
```

### 2.1. 리다이렉션을 구현하는 입장에서 고려하면 좋은 사실들

* 리다이렉션 기호를 기준으로 항상 **오른쪽에 파일이, 왼쪽에 명령어**가 온다. (명령어는 생략 가능)
* 표준입력, 출력은 항상 **파일을 기준으로 생각하기!**&#x20;
  * 가끔 파일에 입력하는게 출력인지 입력인지 헷갈릴 때가 있는데 _받은 입력을 파일에 출력하는 것이기 때문에 **표준출력**을 파일에 넘겨줘야 한다._&#x20;
  * command > file 이면 dup(fd, 1)

## 3. 파이프와 리다이렉션이 같이 있는 경우

### 3.1. 이해를 위해 직접 참고해보면 좋을 케이스들

전부 bash 기준입니다.

```bash
ls -al | echo hi > a.txt | pwd
```

* 터미널 에는 pwd 출력
* a.txt 에는 hi 입력&#x20;

```bash
ls -al | grep Makefile > a.txt | pwd
```

* 터미널 에는 pwd 출력
* a.txt 에는 rw-r--r-- 1 daelee staff 26 2 2 11:13 Makefile 입력

```
ls -al | echo hi > 1234565.txt | grep -e 34
```

* 터미널 에는 아무것도 출력되지 않음
* 123456 에는 hi 입력

세번째 케이스를 bash에 테스트해보니 확실히 이해된 것 같다. **리다이렉션의 결과를 (파이프로 연결된) 다음 프로세스로 넘겨줄 필요가 없다.**

파이프는 앞에있는 프로세스의 표준출력을 뒷 프로세스의 표준입력으로 넘겨주는건데, 리다이렉션을 써버리면 표준출력을 리다이렉션이 지정한 파일로 해버리니까 **넘겨줄 값 자체가 없는 것**이다.

구현하는 관점에서, 그렇다고 이 케이스에서 파이프가 끊긴다고 생각할 필요는 없을 것 같다. 그냥 _**"표준출력으로 출력할 게 없고 표준입력으로 넘겨받을 게 없다, 넘겨받은 값이 0이다."**_ 라고 생각하고 파이프라인은 계속 유지시키면 될 것 같다.
