본문 바로가기
컴퓨터공학기초 개념/시스템 프로그래밍

8. shell - 리다이렉트와 파이프

by devraphy 2021. 9. 7.

1. Standard Stream

- 리눅스의 표준 입출력을 말한다. 

- 리눅스에서는 command로 입력되어 실행되는 3가지 표준 입력스트림이 있다.

 

a) stdin (Standard Input Stream)

- 리눅스에서 사용하는 표준 입력스트림

- 기본적으로 터미널에서 입력을 받는 기능이다.

 

b) stdout (Standard Output Stream)

- 리눅스에서 사용하는 표준 출력 스트림

- 기본적으로 터미널 화면에 출력하는 기능이다.

 

c) stderr (Standard Error Stream)

- 리눅스에서 사용하는 표준 오류 출력 스트림

- 기본적으로 명령어를 틀리게 입력하는 등의 경우, 발생하는 에러를 터미널에 출력하는 기능이다.

 

- 이처럼 모든 스트림은 기본적으로 console에 출력되도록 설계되어있다. 

 


2. Redirection

- 기본적으로 입출력 스트림은 터미널에서 진행된다. 

- 즉, 터미널에서 입력되고 터미널에 출력되는 것이 default 이다.

- 하지만 입출력의 통로를 터미널이 아닌 다른 것으로 대체할 수 있음을 의미한다. 

 

a) 표준 스트림의 흐름을 바꿀 수 있다.

- 꺽쇄(<>) 기호를 사용하여 리다이렉션을 표현할 수 있다. 

- 주로 명령어 표준 출력을 화면이 아닌 파일일 때 사용한다. 

- 아래의 그림을 보면서 이해해보자.

 

- 기본적으로 표준 입출력은 터미널에서 입력을 받아 터미널로 출력을 하는 형식이다. 

- 리다이렉션을 사용하면 좌측의 그림처럼, 출력을 파일로 바꿀 수 있다. 

- 리다이렉션을 사용하면 우측의 그림처럼, 파일의 내용을 입력으로 바꿀 수 있다.  

 

 

b1) 리다이렉션 예시

- ls 명령어를 사용하면 일반적으로 터미널에 파일 목록을 출력한다. 

- 이는 표준 입력을 통해 ls입력을 받고 표준 출력으로 터미널에 결과물을 출력하는 것이다. 

- 하지만, ls > files.txt라는 명령을 통해 ls 명령어에 대한 출력을 터미널이 아닌 files.txt에 저장할 수 있다.

 

 

b2) 리다이렉션 예시

- head 명령어는 함께 명시된 파일의 내용을 앞에서 부터 10줄 터미널에 출력한다. 

- 이는 표준 입력을 명시된 파일의 내용으로부터 받아 오는 것이다. 

- 이 경우 터미널에서 입력을 받는 것이 아니라 파일의 내용을 입력으로 받는 것이다.

 

 

b3) 리다이렉션 예시

- 위의 예시의 경우, file.txt 파일로 부터 입력을 받아서 head 명령을 실행한다. 

- 그리고 head 명령의 실행 결과를 files2.txt에 저장하도록 하는 것이다. 

 

 

b4) 리다이렉션 예시

- file2.txt가 가진 내용에 새로운 내용을 덮어 씌우는 것이 아니라,

- 기존 내용을 놔두고 새로운 내용을 추가하는 방식이다. 


3. Pipe(파이프)

- 파이프는 운영체제 과목에서 IPC기법에서 등장한 내용 중 하나다. 

- 프로세스는 다른 프로세스의 데이터에 접근이 불가하므로, 다른 프로세스의 상태를 알 수 없다.

- 이를 극복하기 위해, 프로세스 간의 통신방법 중 하나로 파이프를 이용한다. 

- 여기에서는 운영체제가 아니라 리다이렉션을 기반으로 파이프의 역할을 이해하자. 

 

a) 파이프란?

- 한 프로세스의 출력 스트림을 다른 프로세스의 입력 스트림으로 사용하는 것

- 짝대기( | )를 사용하여 표현한다. 

- 위의 그림과 같이 어떤 한 프로세스의 결과물(출력)을 파이프를 통해 다른 프로세스의 입력으로 사용한다. 

 

 

b1) 파이프 예시

- 어떤 디렉토리에 파일이 무수히 많은 경우, 특정한 파일을 찾고 싶을때 위의 명령어를 사용할 수 있다. 

- grep이라는 명령어는 입력으로 들어오는 문자열을 검색하여 동일한 문자열을 가진 것을 찾는 역할이다. 

 

- "ls | grep files.txt"는 다음 2개의 프로세스를 가진다. 

- 첫번째는 grep 이라는 프로세스, files.txt 라는 이름을 검색한다. 

- 두번째는 ls 라는 프로세스,  grep으로 찾은 결과물을 ls라는 프로세스의 입력으로 사용하는 것이다. 

 

b3) grep 명령어 참고자료

댓글