정의
표준 입력(stdin; standard input), 표준 출력(stdout; standard output), 표준 에러(standard error)
위 3개는 표준 스트림(standard stream)이라 하며 운영 체제에서 기본적으로 제공하는 추상화된 입출력 장치를 의미한다.
일반적으로 입출력은 시스템에 연결된 키보드와 모니터를 통해서 일어나며 표준 스트림은 이를 추상화했으므로 기본 입출력 장치는 다음처럼 설정된다.
- 표준입력(STDIN):
- 표준 입력 장치의 ID 는 숫자로는 0 이며 일반적으로는 키보드로 명령어를 치고 엔터로 입력하는 방식을 의미
- 키보드로부터 입력을 받기 위해서 사용
- 표준출력(STDOUT):
- 출력을 위한 스트림으로 표준 출력 장치의 ID 는 1이며 일반적으로는 현재 쉘을 실행한 콘솔(console)이나 터미널(terminal)이 된다.
- 모니터로 출력하기 위해서 사용
- 표준에러(STDERR):
- 에러를 위한 스트림으로 표준 에러 장치의 ID 는 2이며 일반적으로는 표준 출력과 동일하다.
- 표준 출력과의 어떠한 구분도 없다면 정상 처리 값인지 에러 값인지 확인할 수 없기에 표준 에러라고 구분한 것
각각 파일 디스크럽터의 ID를 갖는다.
파일 디스크럽터는 리눅스 운영체제가 특정 파일에 접근할 때 사용되는 값을 의미한다.
리눅스 운영체제가 명령어를 실행할 때 각 명령어에 번호를 부여하고 그에 따라 명령어를 실행하는데, 표준 입력, 표준 출력, 표준 에러는 0,1,2 번으로 고정해 사용한다고 생각하면 된다.
왜 사용하는가?
주로 리다이렉션을 통해서 파일로 표준 입력을 받고, 파일로 표준 출력을 받아 리눅스를 좀 더 활용하기 위해서 사용한다.
쉘 스크립트에서 주로 많이 사용되는 것을 알 수 있다.
물론 위 용도로만 사용되는 것은 아님!
리다이렉션이란?
리다이렉션이란 re방향 즉, 방향을 변경하는 것을 의미한다. 리눅스에선 꼭 키보드로 표준 입력을 받거나 화면으로 표준 출력을 하는 것이 아니라 파일로 표준 입력을 받고, 파일로 표준 출력을 받기도 한다.
리다이렉션 기호 | 형태 | 의미 |
< | [명령어] < [파일] | 파일의 내용을 명령어의 입력으로 사용한다. |
> (덮어쓰기) | [명령어] > [파일] | 명령어의 결과(표준 출력)를 파일에 덮어 씌운다 |
>> (추가) | [명령어] >> [파일] | 명령어의 결과를 파일 최하단에 추가한다. |
예를 들어 test.txt 파일이 존재한다고 했을 때 echo "test" > ./test.txt 명령어를 입력하게 되면
- echo를 이용해서 test 문자열을 표준 출력으로 표현하고
- 표준 출력된 test 문자열을 현재 디렉터리의 test.txt 파일에 덮어씌워라
- test.txt 파일 안에는 test라는 문자열이 들어 있는 상태이다.
- cat test.txt를 하게 되면 test 라는 문자열이 출력으로 나오게 된다..
표준 입력의 경우 위에서 내용이 입력된 test.txt 파일로 예를 들어 cat < test.txt 명령어를 입력하게 되면
- cat 명령어는 어떠한 입력 값을 받아서 출력으로 나타내주는 명령어인데, test.txt를 표준 입력으로 받게된다.
- cat을 수행해서 test.txt 안에 있는 내용을 출력으로 나타내준다.
- 결과적으로 test라는 문자열을 반환하게 된다.
두 경우 모두 결과는 동일한데 전혀 다른 과정을 거치고 있다.
표준 입력과 표준 출력을 동시에 사용할 수도 있다.
cat < test.txt > test2.txt 명령어를 입력한다고 가정해보자
- cat 은 어떠한 입력값이 있어야 한다. test.txt 에는 test 라는 문자열이 들어있다.
- 그럼 cat < test.txt 는 test라는 문자가 출력 값으로 나오게 된다.
- test 라는 문자를 표준 입력으로 받아서 test2.txt 파일에 집어넣게 된다.
- cat test2.txt 명령어를 실행하게되면 test.txt에 있는 내용이었던 test 내용이 그대로 test2.txt 에 존재하는 것을 알 수 있다.
표준 입/출력, 에러 활용
형태 | 의미 |
[명령어] 1> [파일] | [명령어] > [파일] 과 같은 의미로, 표준 출력을 [파일] 에 덮어 씌운다. |
[명령어] 2> [파일] | [명령어] 실행 시, 에러가 발생한다면, 에러 내용을 [파일]에 덮어 씌운다. |
[명령어] 1> [파일1] 2> [파일2] | [명령어] 실행 시, 결과 즉, 표준출력은 [파일1]에, 에러가 발생한다면, 에러는 [파일2]에 덮어 씌운다. |
[명령어] 1> [파일1] 2> [파일1] | [명령어] 실행 시, 표준 출력과 에러가 발생한다면 에러를 모두 [파일1]에 덮어 씌운다. |
[명령어] > [파일] 2>&1 | [명령어] 실행 시, 표준 출력과 에러가 발생한다면 에러를 모두 파일에 덮어 씌운다. (위와 동일) |
앞에 활용은 많이 설명이 되었으리라 알고, [명령어] > [파일] 2>&1의 경우만 설명을 하고자 한다.
위와 같이 명령어를 실행하게 되면 어떻게 될까?
ls에는 없는 K 옵션을 이용해 에러를 발생시켜보겠다.
ls -K > test.txt 2>&1 을 실행하게 되면 아무런 표준 출력이 발생하지 않고 test.txt 에 에러 내용이 작성된다.
- ls -K의 출력을 화면에 표시하지 않고 test.txt 파일에 저장한다.
- 2> 부분은 표준 에러를 표준출력(&1)으로 재지정 한다. (만약 &를 붙이지 않으면 1을 파일로 인식해 &를 이용해서 표준 출력 ID로 인식 하게끔 했다.)
- 결과적으로 test.txt 파일에 표준 출력을 저장해야 하나 ls -K 는 에러만 발생이 되어 저장되지 않고 2>&1 옵션을 이용해서 에러가 발생하면 에러 메시지를 표준 출력으로 변환했다.
- 표준 출력으로 변환된 에러 내용은 앞서 표준 출력을 test.txt 로 덮어 씌우게끔 했으므로 에러 내용이 test.txt 파일에 저장된다.
* 위 리다이렉션 기호를 >> 로 변경하면 로그 파일에 로그를 쌓듯이 하단에 출력이나 에러를 쌓을 수도 있다.
/dev/null
sh 파일을 유심히 본 경우 알수 있을 텐데 리눅스 에선 /dev/null 이라는 파일에 리다이렉션 하는 경우가 있다.
/dev/null 파일은 특수 파일로
- 입력 파일로 지정해도 아무 내용도 입력되지 않는다.
- 출력 파일로 지정해도 어떠한 내용도 기록되지 않는다.
는 특성이 있다.
표준 출력으로 출력되는 양이 너무 많거나 표준 에러 출력만 확인할 때 필요하지 않은 내용을 제거하기 위해서 자주 사용하는 방식이다.
cat test.txt > /dev/null 2>&1
명령어를 입력하게 되면
- test.txt 파일의 내용을 출력해서 /dev/null에 덮어 씌워라. 허나 /dev/null은 내용을 없애버리니 아무 내용도 출력되지 않는다.
- 2>&1 표준 에러를 표준 출력으로 재지정 했다. 재지정된 표준 출력은 /dev/null로 가게 되니 아무 내용도 출력되지 않는다.
- 결과적으로 아무 내용도 출력되지 않는다.
내 생각
쉘 스크립트를 작성할 때나 다른 쉘 스크립트를 참고할 때 많이 봤었는데, 다음에 스크립트 작성 시 정확하게 사용이 가능할 것 같다. 완벽하게 이해가 된 듯 하다.
[참조] :
https://www.lesstif.com/lpt/stdin-stdout-stderr-113346293.html
https://bio-info.tistory.com/86
'서버 관리 > 운영체제' 카테고리의 다른 글
[Linux] 출력결과 변형 명령어 정리 (0) | 2024.06.26 |
---|---|
[Linux] 네트워크 관련 명령어 정리 (0) | 2024.05.08 |