티스토리 뷰

728x90

스트림, 리다이렉션, 파이프

스트림(Stream)

• 대부분의 프로그램은 데이터를 입력받아 다시 출력하는 형태

하지만 유닉스 이전의 운영체제에는 데이터의 입출력 작업이 어려웠음.

     - 하드웨어 장치를 통해 입출력을 한다면, 각기 다른 장치마다 서로 다른 설정을 일일이 해주어야 했고, 프로그램끼리의 데이터 입출력을 위해서도 그 프로그램에 대한 환경 설정 등을 일일이 해주어야 했음.

• 유닉스에서는 이런 점을 개선하여 프로그램들과 하드웨어 장치들 모두 파일 형태로 관리하고, 데이터의 입출력 작업을 파일 읽기, 쓰기 작업으로 통일

그리고 이런 파일에서 입출력되며 흐르는 데이터, 또는 그 데이터의 통로를 스트림이라고 정의하여, 사용자가 데이터의 입출력을 관리하고 싶을 경우 스트림을 통해 관리하도록 함.

 

표준 스트림(Standard Stream)

유닉스에서는 사용자가 따로 스트림을 지정하지 않아도 되도록, 표준 스트림이라는 것을 제공

표준 스트림은 사용자가 어떤 스트림을 사용하겠다 명시하지 않았을 경우, 표준 스트림으로 설정된 스트림을 사용하도록 하는 기본 설정 같은 개념

표준 스트림은 프로그램 실행 시 부모 프로세스로부터 값을 상속받아 자동으로 열림

유닉스 쉘은 아래와 같은 3개의 표준 스트림을 갖고 있음.

     - 표준 입력 스트림(Standard Input, STDIN) : 키보드 입력

     - 표준 출력 스트림(Standard Output, STDOUT) : 콘솔 출력

     - 표준 에러 스트림(Standard Error, STDERR) : 콘솔 에러 출력

따라서, 유닉스 쉘로 어떤 프로그램을 실행하면, 스트림을 따로 지정하지 않아도 유닉스 쉘의 표준 스트림을 상속받아, 내가 실행한 프로그램도 입력 - 키보드, 출력 - 콘솔 이라는 스트림을 갖게 되는 것

표준 스트림 역시 파일 형태로 관리되기 때문에, 표준 스트림 파일이 열리면 파일 디스크립션 번호를 할당받음. 할당되는 번호는 아래와 같이 고정이며, 이 때문에 다른 파일들은 번호를 3부터 할당.

     - 표준 입력 스트림 : 0, 표준 출력 스트림 : 1, 표준 에러 스트림 : 2

 

리다이렉션(Redirection)

• 스트림의 방향을 재지정하는 것

• 즉, 키보드로 입력받거나 콘솔에 출력하는 것이 아닌 다른 곳으로 입출력 지정

기호 설명
< 입력 스트림 재지정
> 출력 스트림 재지정 (덮어쓰기)
>> 출력 스트림 재지정 (이어쓰기)
2> 에러 스트림 재지정 (덮어쓰기)
2>> 에러 스트림 재지정 (이어쓰기)
>& 출력 & 에러 스트림 재지정 (덮어쓰기)
>>& 출력 & 에러 스트림 재지정 (이어쓰기)
※ 참고 : 입력 0, 출력 1은 생략
history > result.txt # history 명령의 결과가 표준 출력 스트림에 의해 콘솔에 출력되는 것이 아닌 재지정된 스트림에 의해 result.txt에 출력됨.
echo "Hello" > result.txt # echo 명령의 결과가 result.txt 파일에 덮어쓰기 됨.
echo "Hi" >> result.txt # echo 명령의 결과과 result.txt 파일에 이어쓰기 됨. 즉, Hello Hi 됨.

cat < result.txt # cat이 입력을 표준 입력 스트림에 의해 키보드로 받는 것이 아닌 재지정된 스트림에 의해 result.txt의 내용을 받는다.

 

파이프(Pipe)

• 프로세스간에 스트림을 이어 A의 출력을 B의 입력으로 들어가게 하는 것

cat result.txt | grep "He" # cat 명령으로 인한 result.txt 안의 내용물 출력이 grep의 입력으로 들어감. result.txt의 내용에서 He 문자열을 검색해줌.
cat result.txt | sort -r # result.txt 내용물을 내림차순으로 정렬.
cat result.txt | sort -r | grep "el" # cat 명령의 결과 출력이 sort 명령어의 입력으로 들어가고, sort 명령의 결과 출력이 grep으로 들어감.

 

※ 참고

• 한 줄에 여러 명령을 쓰고 싶다면,  첫 번째 명령; 두 번째 명령; 세 번째 명령  이런 식으로 가능

 

 

 

 

 

 

 

 

 

이 글은

유튜브 뉴렉처 리눅스(Linux) 서버 강의/강좌 for 개발자

강의를 듣고 공부한 내용을 바탕으로 작성되었습니다.


728x90
댓글
250x250
공지사항