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

이대현·2021년 2월 12일
2

42SEOUL

목록 보기
22/27

리다이렉션 처리를 이해하려면 앞의 글 파이프 처리에서 정리했던 dup2 함수에 대한 이해가 필요합니다.

1. 리다이렉션 기호

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

2. 리다이렉션 핵심

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

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

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

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

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

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

전부 bash 기준입니다.

ls -al | echo hi > a.txt | pwd
  • 터미널 에는 pwd 출력
  • a.txt 에는 hi 입력
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이다." 라고 생각하고 파이프라인은 계속 유지시키면 될 것 같다.

profile
삽질의 기록들 👨‍💻

0개의 댓글