본문 바로가기
강의 실습/비전공자도 이해할 수 있는 리눅스 입문 실전

표준 에러 출력(stderr)이란?

by jint 2025. 11. 11.

1. 표준 에러 출력(stderr)이란?
- Ubuntu

ubuntu@ip-172-31-39-75:~$ ls
app.txt  awesome-service  directory.txt  dummy.txt  list.txt  myfile.txt  new-box
ubuntu@ip-172-31-39-75:~$ ls abc
ls: cannot access 'abc': No such file or directory
ubuntu@ip-172-31-39-75:~$ ls abc > list2.txt
ls: cannot access 'abc': No such file or directory
ubuntu@ip-172-31-39-75:~$ ls
app.txt  awesome-service  directory.txt  dummy.txt  list.txt  list2.txt  myfile.txt  new-box
ubuntu@ip-172-31-39-75:~$ cat list2.txt


ls abc 와 같이 파라미터를 잘 못 입력해 명령어를 입력하면, 명령어의 결과값이 터미널에 출력된다.
ls abc 명령어의 결과값이 터미널이 아닌 파일에 출력되도록 하기 위해 ls abc > list2.txt 명령어를 실행시켰지만, 여전히 터미널에 결과값이 출력되고 파일에 출력되지 않았다. 왜 그럴까?

 

정상적인 실행 결과 출력 함수와 에러 메시지 출력하는 함수가 구별됨


리눅스에서 명령어의 실행 결과가 아닌 에러 메시지를 출력할 때 별도의 메서드를 호출(ex. perror())하여 출력한다. 즉, 정상적인 실행 결과값을 출력하는 함수와 에러 메시지를 출력하는 함수가 구별되어 있다.
이 때, 에러 메시지를 출력하는 perror() 함수의 역할은 표준 에러 출력이라는 곳으로 에러 메시지를 전달하는 역할을 한다. 에러 메시지를 전달받은 표준 에러 출력은, 기본적으로 터미널에 에러 메시지가 출력되도록 만든다.

* 참고
c 언어에서의 perror() 함수는 Java 에서의 System.err.println() 또는 Javascript 에서의 console.error() 와 같은 출력 함수 중 하나이다.

 

표준 출력과 표준 에러 출력은 독립적인 통로로 구성


ls abc > list2.txt 명령어를 통해 표준 출력을 터미널 화면이 아닌 파일로 연결되도록 바꿨지만, 표준 출력과 표준 에러 출력은 독립적인 통로로 구성되어 있기 때문에, 에러 메시지 발생시 표준 출력이 아닌 표준 에러 출력의 통로를 거쳐 터미널에 에러 메시지가 출력된 것이다.

그럼 어떻게 해야 에러 메시지를 터미널이 아닌 파일로 출력되게 할 수 있을까?
> 가 아닌 2> 라는 기호를 사용한다. 그러면 표준 에러 출력은 파일에 저장된다.

- Ubuntu

ubuntu@ip-172-31-39-75:~$ ls abc 2> list3.txt
ubuntu@ip-172-31-39-75:~$ ls
app.txt  awesome-service  directory.txt  dummy.txt  list.txt  list2.txt  list3.txt  myfile.txt  new-box
ubuntu@ip-172-31-39-75:~$ cat list3.txt
ls: cannot access 'abc': No such file or directory


에러 메시지가 터미널이 아닌 파일에 저장된 것을 확인할 수 있다.

 

표준 에러 출력 연결 방향 바꿈


한 가지 더 테스트 하여, 정상적인 결과값이 출력되는 명령어와 2> 기호를 사용하면 결과값이 어떻게 처리되는지 확인한다.

- Ubuntu

ubuntu@ip-172-31-39-75:~$ ls 2> list4.txt
app.txt  awesome-service  directory.txt  dummy.txt  list.txt  list2.txt  list3.txt  list4.txt  myfile.txt  new-box
ubuntu@ip-172-31-39-75:~$ ls
app.txt  awesome-service  directory.txt  dummy.txt  list.txt  list2.txt  list3.txt  list4.txt  myfile.txt  new-box
ubuntu@ip-172-31-39-75:~$ cat list4.txt


에러 메시지가 아닌 정상적인 결과값은 표준 출력을 통해 전달되므로, 파일이 아닌 터미널에 출력된다.


2. "표준 출력"과 "표준 에러 출력" 둘 다 파일로 출력하려면?
표준 출력과 표준 에러 출력 둘 다 파일로 출력(= 리다이렉션)하고 싶다면 어떻게 해야 할지 살펴본다.

1) 서로 다른 파일로 출력하게 만들고 싶은 경우
- Ubuntu

ubuntu@ip-172-31-39-75:~$ ls > list.txt 2> error.txt
ubuntu@ip-172-31-39-75:~$ cat list.txt
app.txt
awesome-service
directory.txt
dummy.txt
error.txt
list.txt
list2.txt
list3.txt
list4.txt
myfile.txt
new-box
ubuntu@ip-172-31-39-75:~$ cat error.txt
ubuntu@ip-172-31-39-75:~$ ls xxx > list.txt 2> error.txt
ubuntu@ip-172-31-39-75:~$ cat list.txt
ubuntu@ip-172-31-39-75:~$ cat error.txt
ls: cannot access 'xxx': No such file or directory


정상적인 결과값을 출력하는 경우, ls > list.txt 2> error.txt 명령어 처럼 입력할 수 있고,
에러 메시지를 출력하는 경우, ls xxx > list.txt 2> error.txt 명령어 처럼 입력할 수 있다.

2) 같은 파일로 출력하게 만들고 싶은 경우
- Ubuntu

ubuntu@ip-172-31-39-75:~$ ls > all.txt 2> all.txt ^C
ubuntu@ip-172-31-39-75:~$ ls > all.txt 2>&1
ubuntu@ip-172-31-39-75:~$ ls
all.txt  app.txt  awesome-service  directory.txt  dummy.txt  error.txt  list.txt  list2.txt  list3.txt  list4.txt  myfile.txt  new-box
ubuntu@ip-172-31-39-75:~$ cat all.txt
all.txt
app.txt
awesome-service
directory.txt
dummy.txt
error.txt
list.txt
list2.txt
list3.txt
list4.txt
myfile.txt
new-box


ls > all.txt 2> all.txt 명령어 처럼 작성하면 충돌로 인해 메시지가 잘 못 기록될 수 있으므로, ls > all.txt 2>&1 명령어 처럼 작성하는 것이 올바른 방식이다.


3. 정리
표준 출력(stdout) : 명령어의 실행 결과를 "출력할 곳"으로 이동시켜주는 통로
표준 출력을 어디로 연결할 지 변경할 때(= 리다이렉션)는 > 기호 사용
표준 에러 출력(stderr) : 명령어 실행 시 발생한 에러 메시지를 "출력할 곳"으로 이동시켜주는 통로
표준 에러 출력을 어디로 연결할 지 변경할 때(= 리다이렉션)는 2> 기호 사용


참고링크 : https://www.inflearn.com/course/%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90%EB%8F%84-%EC%9D%B4%ED%95%B4%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9E%85

 

비전공자도 이해할 수 있는 리눅스 입문/실전| JSCODE 박재성 - 인프런 강의

현재 평점 5.0점 수강생 284명인 강의를 만나보세요. 비전공자 입장에서도 쉽게 이해할 수 있고, 실전에서 바로 적용 가능한 '리눅스 입문' 강의를 만들어봤습니다! 리눅스를 처음 배우시는 분, Per

www.inflearn.com

댓글