컴퓨터 세상/LiNuX

입/출력 방향 변경 - 오류 리다이렉션

Jimin Daddy 2022. 2. 2. 12:35

명령을 실행하는 과정에서 셸이 화면에 출력하는 메시지는 두 가지이다.
하나는 명령의 정상적인 실행 결과이고, 다른 하나는 명령 실행 중 발생하는 오류 메시지 이다.
정상적인 실행 결과는 표준 출력이고, 오류 메시지는 표준 오류라고 한다.

ex) [user1@localhost ch4]$ ls
      out1                    --> 표준 출력
      user1@localhost ch4]$ ls /abc
      ls : cannot access '/abc' : 그런 파일이나 디렉토리가 없습니다.      --> 표준 오류

표준 출력과 표준 오류는 다르게 관리된다.
ex) [user1@localhost ch4]$ ls > ls.out    : 표준 출력 리다이렉션
      [user1@localhost ch4]$ ls /abc > ls.err   : 표준 출력 리다이렉션
      ls : cannot access '/abc' : 그런 파일이나 디렉토리가 없습니다.    : 오류 메시지가 화면에 출력된다.
      [user1@localhost ch4]$ cat ls.err            : 오류 메시지가 출력되지 않는다. 따라서 저장되지 않았다.
      [user1@localhost ch4]$ cat ls.out           : 표준 출력 내용이 출력된다.
      ls.out
      out1
표준 출력은 1번, 표준 오류는 2번 장치 파일이다. '>'는 '1>' 같은 것이기 때문에 '>' 로는 표준 오류가 리다이렉션되지 않는다.
표준 오류를 저장하는 방법은 아래와 같다.
기능 : 표준 오류 메시지를 파일에 저장한다.
형식 : 명령 2>파일명
'2>'는 2번 파일, 즉 stderr 파일로 나갈 내용을 지정한 파일에 저장하라는 것이다.
오류 리다이렉션에서는 파일 디스크립터 번호를 생략할 수 없다. (표준 출력은 '1'을 생략해도 됨)
ex) [user1@localhost ch4]$ ls /abc 2> ls.err      : 표준 오류를 리다이렉션 한다.
      [user1@localhost ch4]$ cat ls.err
      ls : cannot access '/abc' : 그런 파일이나 디렉토리가 없습니다     : ls.err 파일에 저장된 메시지 출력

* 표준 출력과 표준 오류를 한 번에 리다이렉션 하기
   명령의 정상적인 실행 결과와 오류 메시지를 한 번에 리다이렉션하여 각각 파일에 저장하려면 '>' 와 '2>'를 함께 사용하면 된다.
   ex) [user1@localhost ch4]$ ls . /abc > ls.out 2> ls.err
   위에서 '.'은 현재 디렉토리이므로 ls.out에는 현재 디렉토리 내용이 파일로 저장하고 '/abc'라는 디렉토리는 없으므로 ls.err 에는오류 메시지가 저장된다.

* 오류 메시지 버리기
  명령 실행 중 나타나는 오류 메시지를 무시하고 싶을 때는 리눅스의 특수 파일인 '/dev/null'을 사용하면 된다.
  '/dev/null' 파일은 버리고 싶은 내용을 담는 장치 파일로, 이 파일로 전달된 모든 내용은 시스템에서 사라지고 복구할 수 없다.
  ex)[user1@localhost ch4]$ ls /abc 2> /dev/null

* 표준 출력과 표준 오류를 한 파일로 리다이렉션하기
   아래와 같이 실행하면 내용을 덮어쓰지 않고 깔끔하게 모든 출력과 오류 메시지를 한 파일로 리다이렉션할 수 있다.
   ex) [user1@localhost ch4]$ ls . /abc > ls.out 2>&1
         [user1@localhost ch4]$ cat ls.out
         ls : cannot access '/abc' : 그런 파일이나 디렉토리가 없습니다     : 오류 메시지를 저장한다.
         .                                                                                                   : 현재 디렉토리 내용임.
         ls.err
         ls.out
         out1

   1. 명령의 정상 실행 결과를 파일로 리다이렉션한다. ('>')
   2. 그 명령 전체의 오류 메시지를 1번 파일(표준 출력 파일, &1이라고 표현함)로 리다이렉션한다. ('2>')
   위와 같이 1번을 실행하면서 표준 출력이 먼저 변경된다. 표준 출력이 변경된 다음이므로 2번에서는 오류 메시지를 1번파일로 보내기만 하면 된다. 2번은 '2>&1'과 같이 지정한다.
   이것은 2번 파일을 1번으로 리다이렉션하라는 뜻이다. '2>&1' 처럼 공백이 있으면 안 됨.