보통 stdin은 표준 입력, stdout은 표준 출력, stderr은 표준 에러를 나타내는 것들입니다. 이에 대해서는 파일에 대해서 다룰 때 이야기 하도록 하고요. 자세히 들어가면 글이 길어질 듯 하니, 간단하게 어떤 식으로만 쓰는지 알아보도록 하겠습니다. 대략적인 그림부터 보겠습니다.

 

 

 이 그림만 보면, stdin, 즉 표준 입력 스트림에서 읽어오고, stdout, 표준 출력 스트림에 씁니다. 그리고 오류가 발생한 경우 stderr, 표준 에러 스트림에 씁니다. 그런데, 이것을 재지정 하는 방법이 없을까요? 이를 리다이렉션이라고 이야기 합니다.

 

 


 먼저, >는, 출력 재지향을 의미합니다.

 

 

 먼저 head 명령어를 이용해 봅시다. 저는 아직 리다이렉션을 하지 않았기 때문에, stdout 스트림을 쓸 것이고, 이것은 모니터에다가 결과값을 출력해 줍니다. 그러면 쉘에 이런 내용이 출력이 되겠네요.

 

 

 >를 쓰면 어떤가요? 보시면 head huffman.txt를 한 결과를 표준 출력에 쓴 게 아니라, head_res.txt로 바꾸었어요. 즉, 표준 출력 버퍼에 쓰는 게 아니라, head_res.txt에다가 결과값을 쓰겠다는 겁니다.

 

 

 이런 상황입니다. 출력을 할 때 표준 버퍼를 쓰지 않는다는 게 포인트에요.

 

 

 그러면, head clock.c의 결과를 또 head_res.txt에 써 보도록 합시다.

 

 

 정리하자면, 출력 재지정을 하려면 > 을 쓰시면 됩니다. 그런데, head_res.txt를 까 보니까, 새로운 결과값만 들어있음을 알 수 있어요. append를 시킬 수 없을까요? 이것 또한 가능합니다. >>을 붙여주면 됩니다. 그러면 해당 파일에 append를 시킵니다.

 

 

 보시면 >>을 넣은 경우, 기존에 있었던 내용에 10개 줄이 덧붙여 졌음을 알 수 있어요.

 

 


 그러면 find: 어쩌고 에러가 나오는 건 무엇일까요? 화면에다가 출력이 되는 건 똑같습니다. find chogahui라고 치면, 'chogahui'라는 파일이나 디렉토리를 찾을 수 없다고 뜹니다. 그러면 이게 무슨 스트림을 쓸까요?

 

 

 find chogahui 라는 명령어의 출력 스트림를 find_res.txt으로 재지향을 합니다. 그런데 find_res.txt를 cat 명령어로 보니까, 아무런 내용이 없습니다. 이는, 에러 메세지가, stdout 스트림을 쓰지 않았다는 겁니다.

 

 

 그것과는 별개인 find_res.txt를 썼다는 겁니다. 그러면 에러 메세지가 이 파일에 저장되게 하기 위해서는 어떻게 해야 할까요? stderr를 find_res.txt로 재지향을 시키면 됩니다.

 

 

 

  그러면 에러 내용이 화면이 아니라, 파일에 출력이 될 거에요.

 

 

 find chogahui의 2번 스트림을 find_res.txt로 redirect를 했는데요. 2번이 stderr입니다. 그러니, 해당 파일이나 디렉토리를 찾을 수 없다는 에러 메세지가, 콘솔이 아닌 파일에 출력이 된 것입니다.

 

 


 그러면 입력 스트림도 바꿔치기 할 수 있을까요? 이것 또한 가능합니다.

 

 

 wc.c는 다음과 같습니다. 그리고 저는 이것을 컴파일 해서 실행 파일 wc2로 만들었습니다. aa < bb는 파일 bb를 aa의 인풋으로 쓰겠다는 건데요.

 

 

 보시면 test.txt를 wc2의 인풋으로 삼고 있습니다. 그러면 그림을 다음과 같이 그릴 수 있습니다.

 

 

 stdin에서 받아올 거를, test.txt에서 받아오고 있어요. 그러면, wc2가 test.txt에서 입력을 받아오고, wc2_res.txt에 결과값을 쓰게 할 수 있을까요? 네. 있습니다. 아래와 같이 쓰시면 됩니다.

 

 

 그림으로 표현하면 다음과 같겠네요.

 

 

 redirect 명령어를 어떻게 구현하는지는, 그리고 파일 디스크립터와 같은 것들은 천천히 이야기 해 보도록 하겠습니다.