표준 스트림(Standrad Stream)
유닉스 이전의 대부분의 운영 체제에서, 프로그램은 명시적으로 적절한 입력 장치와 출력 장치에 연결해줄 필요가 있었다. 이 작업은 각 OS 마다 처리 방식이 달랐기 때문에 매우 방대한 작업이었다. 수많은 시스템에서 환경 설정을 제어하거나, 파일 테이블에 접근하거나, 필요한 데이터 셋을 결정하기 위해 펀치 카드 리더기나 자기 테이프 드라이브, 라인 프린터, 카드 펀치, 대화식 터미널을 적절하게 제어할 필요가 있었다. 이런 상황에서, 유닉스의 획기적인 발전 중 하나는 장치의 추상화였다. 프로그램은 더 이상 어떤 장치와 연결되는지 알 필요가 없었다. 유닉스는 기존의 복잡성을 데이터 스트림이라는 개념으로 해소 시켰다. 데이터 스트림은 순차적인 데이터 바이트들을 파일의 끝(EOF)까지 읽는다. 이런 방식으로, 프로그램은 쓸 데이터가 얼만큼 남았는지, 혹은 어떤 식으로 묶여있는지 알 필요 없이 필요한 데이터를 쓸 수 있었다.
또 다른 유닉스의 획기적인 발전은, 자동으로 연결되는 입출력 장치였다. 프로그래머나 프로그램에서 입출력을 사용해야 할 때, 입출력 장치를 연결하기 위한 그 어떤 추가 작업도 필요하지 않게 되었다. 이전의 운영 체제들에서 입출력 장치를 연결하기 위해 복잡한 작업 제어 언어가 필요하거나, 그와 동일한 역할을 하는 프로그램이 필요했던 것과는 대조적이다.
유닉스에서 표준 스트림이 지원된 이후로, 유닉스 C 실행 환경에서도 이를 잘 지원해야 할 의무가 생겼다. 그 결과로, 대부분의 C 실행 환경에서 운영 체제와 상관없이 동일한 기능을 제공하게 되었다.
표준 입력(stdin)
표준 입력은 프로그램으로 들어가는 입력값의 데이터(보통은 문자열) 스트림이며, Standard Input을 stdin으로 줄여 표현한다. 리눅스 쉘에서는 표준 설정이 키보드로 되어 있다. 그러나 모든 프로그램이 입력을 요구하지 않으며, 대표적인 예로는 비밀번호를 입력할 때 이러한 표준 입력 스트림을 사용한다.
표준 출력(stdout)
표준 출력은 프로그램이 출력 데이터를 기록하는 스트림으로, Standard Output을 stdout으로 줄여 표현한다. 표준 출력은 텍스트 터미널에서 이루어진다. 표준 입력과 마찬가지로 모든 프로그램이 출력을 요구하는 것은 아니다.
표준 에러(stderr)
표준 오류는 프로그램이 오류 메세지나 진단을 출력하기 위해 일반적으로 쓰이는 또다른 출력 스트림이며, Standard Error를 stderr로 줄여 표현한다.
리다이렉션(redirection)
리다이렉션을 이용하면 스트림의 방향을 지정할 수 있다.리다이렉션을 사용하면 표준 입력을 키보드가 아닌 파일로부터 받을 수 있고, 표준 출력을 디스플레이가 아닌 파일로 할 수 있다.
리다이렉션 기호 | 방향 | 의미 |
> | 표준 출력 | 명령의 결과를 파일로 저장 (기존 파일 덮어씀) |
>> | 표준 출력(append) | 명령의 결과를 기존 파일에 추가 |
< | 표준 입력 | 파일의 데이터를 명령에 입력 |
예시를 따라해보자 현재경로에 아래의 파일이 있다고 가정
$ ls
test01.txt, test02.txt
$ ls > ls_list.txt
ls 는 현재 디렉토리의 내용을 터미널에 출력하는 기능을 수행한다. 하지만 위의 리다이렉션을 사용한다면 출력이 터미널이 아닌 ls_list.txt로 저장이된걸 확인할수 있다. 리다이렉션으로 표준 출력의 방향을 바꾼 것 이다.
$ ls
test01.txt test02.txt ls_list.txt
$ cat ls_list.txt
test01.txt
test02.txt
ls_list.txt
ls 로 확인하면 3개의 텍스트 파일이 생성된걸 확인할수 있고 cat 으로 ls_list.txt 를 한다면 리다이렉션이 잘된걸 확인했다.
$ ls >> ls_list.txt
$ cat ls_list.txt
test01.txt
test02.txt
ls_list.txt
test01.txt
test02.txt
ls_list.txt
이번에는 >> 를 사용했더니 ls_list.txt 파일에 똑같은게 추가가되어있다 이렇게 > , >> 의 차이점으로는 >는 덮어씌우기이고 >> 는 추가라고생각하면된다
$ tail -n 2 < ls_list.txt
test02.txt
ls_list.txt
표준 입력 < 으로 뒤에서 2번째 부분만 출력된걸 알수 있다
파이프라인
앞서 배운 리다이렉션이 프로세스의 입력 또는 출력을 파일로 사용하는 것이라면 이번에 배울 파이프(pipe)는 서로다른 프로세스간 작동하는 방식이다. 특수기호는 ‘|’을 사용한다. 일반적으로 A|B 형태로 사용하는데, 이말은 A 커맨드의 표준 출력을 B 커맨드의 표준 입력으로 사용한다는 의미이다.
$ ps -ef | grep nginx
위 커맨드는 ps -ef 명령어를 통해 나온 출력 결과중 nginx이라는 문자를 포함하는 결과를 출력한다는 내용입니다. 참고로 ps 명령어는 실행중인 프로세스 목록을 보는 명령어 이며, -e 옵션은 실행중인 모든 모르세스 정보 출력, -f 옵션은 프로세스에 대한 자세한 정보를 출력한다는 옵션이다.
'DevOps > Linux' 카테고리의 다른 글
[Linux] 리눅스 네트워크 네임스페이스 (1) | 2023.02.06 |
---|---|
[Linux] 프록시 서버의개념, NGINX 리버스 프록시와 캐싱 (0) | 2022.12.29 |
[Linux] NGINX 개념과 각 환경에서 설치방법 (0) | 2022.12.15 |
[Linux] Read, Write, Execute 권한, chmod 권한 변경 (0) | 2022.12.02 |
[Linux] 리눅스 디렉토리 구조 개념 (0) | 2022.11.30 |