Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
리디렉션의 모든 것

3. 리디렉션의 모든 것

3.1. 정의와 기본 설명

stdin(표준 입력), stdout(표준 출력), stderr(표준 에러)라는 세 가지의 파일 디스크립터가 있다. 파일 디스크립터가 무엇인지 일일히 설명하기는 그렇고.... 간단하게 이해해 보자. 어떤 프로그램을 실행했을 때 화면에 주루룩 하고 원하는 결과가 뜨는 것이 표준 출력이다. 어떤 프로그램을 실행하기 위해 꼭 필요한 요소를 프로그램을 실행할 때 같이 입력해 주는 것이 표준 입력이다. 이 정도만 알고 시작하면 될 것이다.

먼저 다음과 같은 내용을 간단히 실행해 보자. 백문이 불여일견, 백견이 불여일행인 법. ^^

  1. 표준 출력을 파일로 보내기

  2. 표준 에러를 파일로 보내기

  3. 표준 출력을 표준 에러로 보내기

  4. 표준 에러를 표준 출력으로 보내기

  5. 표준 에러와 표준 출력을 파일로 보내기

  6. 표준 에러와 표준 출력을 표준 출력으로 보내기

  7. 표준 에러와 표준 출력을 표준 에러로 보내기

먼저 간단히 말해두겠는데, 버퍼에 남아 있는 표준 출력이나 표준 에러를 화면에 출력해 보는 것은 아주 쉽지만, 그 시도와 동시에 내용이 날아간다는 점을 상기하자.

3.2. 예제 : 표준 출력을 파일로 보내기

프로그램의 실행 결과를 파일에 바로 저장하는 방법이다. 이 방법은 언제 쓰면 좋으냐 하면.... 그렇다, 수치해석 숙제 할 때 줄줄이 에러값 나오는 것, 이 방법으로 하면 파일에 기록하는 코드 없이도, 화면 캡처 따위 하지 않아도 아주 간단하게 해결된다. ^^

 
ls -l > ls-l.txt 

이 내용을 실행하고 나면, 화면에 'ls -l' 명령의 실행 결과가 출력되는 대신 'ls-l.txt'라는 이름의 파일이 생긴다. 이 파일을 열어 보면 원래 'ls -l' 을 실행했을 때의 결과가 그대로 저장되어 있다. 이런 이름의 파일이 원래 있었다면, 파일의 앞부분에 그대로 출력 내용이 덮어 씌워져 버리니 주의하자.

3.3. 예제 : 표준 에러를 파일로 보내기

방법은 마찬가지이다. 이 경우에는 에러 메시지를 파일에 저장하는 것 뿐이다. 역시 같은 방법으로 다음과 같이 해 보자.

 
grep da * 2> grep-errors.txt 

앞서 표준 출력을 파일로 보냈을 때와 마찬가지로, 'grep-errors.txt' 파일이 만들어지며 화면 대신 이 파일 안에 에러 메시지가 기록된다. 여기에서 숫자 2는 표준 에러를 뜻하는 파일 디스크립터이다. 2가 들어가지 않으면 표준 출력이 저장된다.

3.4. 예제 : 표준 출력을 표준 에러로 보내기

이 방법은 프로그램을 실행했을 때의 표준 출력을 표준 출력 디스크립터 대신 표준 에러와 같은 방식으로 출력하는 것이다.

 
grep da * 1>&2 

이와 같은 방법으로 명령의 표준 출력이 표준 에러에게 넘겨졌다. 그런데 정말 이것만으로 이해가 착착 간다면 정말 이 문서 볼 필요 없다. 어쩔 수 없이 추가 설명을 달아야만 하는 부분인데..... 간단히 설명하겠다. 'grep da *'는 우리가 익히 알고 있는 단순한 명령이다. 이 뒤에 붙은 숫자는 파일 디스크립터이며 특히 1은 표준 출력을 의미한다. 2는 표준 에러 되겠다. 그런데 사실, 조금만 신경 쓰면 알 수 있는 부분이지만 '1>'는 그냥 '>'와 같은 것이다. 이유는 각자 생각해 보자. 금방 결론이 나올 것이다. 참고로 0은 표준 입력, 3 이후는 다른 파일이 입출력용으로 할당될 때 사용하는 것으로, 그냥 적어 넣으면 에러 메시지를 볼 수 있을 것이다.

리디렉션을 '2>&1'과 같이 주면 표준 에러를 표준 출력과 같은 곳으로 보내라는 뜻이며, '1>&2'의 경우는 표준 출력을 표준 에러와 같은 곳으로 보내라는 뜻이다.

3.5. 예제 : 표준 에러를 표준 출력으로 보내기

위 내용을 잘 섭렵해 왔다면 생각해 볼 필요도 없는 부분이다.

 
grep * 2>&1 

자, 표준 에러를 표준 출력으로 보내어 함께 출력하였다. 만약에 이 결과를 파이프를 통해 more나 less 등으로 보낸다면, 표준 출력과 표준 에러가 뒤섞인 형태를 보게 될 것이다.

3.6. 예제 : 표준 출력과 표준 에러를 파일로 보내기

이 내용 역시 위와 똑.같.다. 라고 봐도 무방하지만..... 이것을 한번에 파일로 보내는 부분은 함께 보도록 하자.

 
rm -f $(find / -name core) &> /dev/null 

따로이 디스크립터를 사용할 필요 없이 '&>'로 리디렉션 하는 것 만으로 해결된다. 이 방식은 표준 출력과 표준 에러를 함께 파일로 보낼때 사용한다. 이 명령을 크론에 넣어 두면, 일정한 시간마다 모든 디렉토리에 있는 core 파일을 삭제한다. 여기에서는 표준 출력과 표준 에러를 모두 '/dev/null'로 보내 실제로는 날려 버리지만, 굳이 이 내용을 확인하고 싶다면 적당한 파일로 출력하여 살펴보도록 하자.