리다이렉션 처리를 이해하려면 앞의 글 파이프 처리에서 정리했던
dup2
함수에 대한 이해가 필요합니다.
command > file
: 표준출력을 파일에 덮어쓰거나(overwrite) 파일이 없다면 새로 생성함command < file
: 파일의 데이터를 명령어의 표준입력(input)으로 넘김command >> file
: 표준출력을 파일에 개행문자 후 덧붙이거나(append) 파일이 없다면 새로 생성함파이프에서 배웠던 dup2(fd1, fd2)
함수가 리다이렉션에서에서도 중요하다. 파이프와의 차이점은, 표준입력과 표준출력을 넘겨주는 대상이 프로세스가 아니라 파일(file)이라는 것 뿐이다.
dup2(in_fd, 0) //표준입력을 in_fd가 가리키는 파일로 대체
dup2(out_fd, 1) //표준출력을 out_fd가 가리키는 파일로 대체 => 이후로 모든 표준출력 결과가 가리키는 파일에 기록된다.
전부 bash 기준입니다.
ls -al | echo hi > a.txt | pwd
ls -al | grep Makefile > a.txt | pwd
ls -al | echo hi > 1234565.txt | grep -e 34
세번째 케이스를 bash에 테스트해보니 확실히 이해된 것 같다. 리다이렉션의 결과를 (파이프로 연결된) 다음 프로세스로 넘겨줄 필요가 없다.
파이프는 앞에있는 프로세스의 표준출력을 뒷 프로세스의 표준입력으로 넘겨주는건데, 리다이렉션을 써버리면 표준출력을 리다이렉션이 지정한 파일로 해버리니까 넘겨줄 값 자체가 없는 것이다.
구현하는 관점에서, 그렇다고 이 케이스에서 파이프가 끊긴다고 생각할 필요는 없을 것 같다. 그냥 "표준출력으로 출력할 게 없고 표준입력으로 넘겨받을 게 없다, 넘겨받은 값이 0이다." 라고 생각하고 파이프라인은 계속 유지시키면 될 것 같다.