본문 바로가기

linux

Linux 표준 출력 제어 (STDOUT, STDERR)

script를 작성하거나, error log들을 관리 하기위해 "출력 내용 redirect" 할 수 있어야한다.
회사에서 간단한 스크립트를 만들면서 특정 명령어의 에러를 변수값으로 사용하려고 당연하게 redirection을 했는데, command의 결과가 그대로 출력이 되고 변수에는 아무런 값이 저장이 되지 않고 있었다..
표준입출력,에러에 대한 개념이 없어서 모든 command의 output이 당연히 redirection 될거라 생각했는데,,ㅜ0ㅠ
이렇게 시간낭비 하지 않기위해 우선 개념을 명확히 할 필요가 있다.

  • 표준출력(STDOUT) ? shell에서 정상 종료 되면서 출력되는 메세지(Output)을 의미한다
    $ ls
    testSTDOUT	testheadtail​
  • 표준에러(STDERR) ? shell에서 비정상 종료 시 출력되는 에러 메세지를 의미한다.
    $ ls stderrtest
    ls: stderrtest: No such file or directory​

Redirection !

표준출력의 경우, 일반적으로 아래와 같이 사용하면 문제없이 redirection이 된다.

$ ls > storels # 표준출력(STDOUT)을 storels에 입력
$ cat storels
storels
testSTDOUT
testheadtail
* '>' 한개만 작성하는 경우 동일한 이름의 기존 파일이 있다면 replace하고, '>>' 와 같이 입력하면 기존 파일 내용에 append한다.

하지만 표준에러(STDERR)의 경우, 아래와 같이 입력하더라도 아무런 내용이 저장되지 않는다 ㅠ_ㅜ

$ ls errormsg > storels ### ls errormsg는 없는 파일/디렉토리 이므로 아래에 바로 에러가 출력된다.
ls: errormsg: No such file or directory
$ cat storels 
$ # 아무 내용이 없음

이럴땐 아래와 같이 STDERR을 의미하는 숫자'2'를 redirection mark 앞에 붙여서 해당 출력 내용을 옮길 수 있다.
(0 : 표준입력 STDIN, 1: 표준출력 STDOUT, 2: 표준에러 STDERR)

$ ls errormsg 2> storels # 이전과 다르게 아래에 에러 출력되지 않음
$ cat storels
ls: errormsg: No such file or directory

또한 아래와 같이 /dev/null을 이용하면 모든 출력(STDOUT, STDERR)이 출력되지 않도록 할 수 있다. (일종의 휴지통 느낌..?)

$ ls >&/dev/null # STDOUT 출력 안함
$ ls errormsg >&/dev/null # STDERR 출력 안함

마지막으로 모든 표준출력, 표준에러를 모두 하나의 입력파일에 저장하려면 아래와 같이 할 수 있다..! 모두들 단번에 알아봤겠지만, 표준 에러를 표준 출력으로 redirection하고 해당 내용을 파일에 appned하는 명령어다.

$ ls  >> storels 2>&1  ## 표준 출력을 storels에 append
$ ls nonefile >> storels 2>&1  ## 표준 에러를 storels에 append
$ cat storels ## line 1-3 : 표준 출력, line 4: 표준 에러 
storels
testSTDOUT
testheadtail
ls: nonefile: No such file or directory

 

반응형