본문 바로가기
프로그래밍 언어/Shell script(BASH)

[Shellscript] 입력 및 출력 리다이렉트, 그리고 파이프라인

by Physics 2021. 6. 27.
728x90

0. 리눅스 시스템에서의 입력 및 출력 

1) 리눅스 시스템에서는 모든 개체들을 파일로 다루며, 입력과 출력 과정 역시 파일로 다룬다.  
  - 리눅스는 파일 디스크립터를 사용하여 각 파일 개체들을 식별함 
  - 파일 디스크립터: 세션에서 열려있는 파일들을 식별하는 음이 아닌 정수 
2) BASH 쉘의 특수한 3개의 파일 디스크립터 (0,1,2) 
  - 아래의 파일 디스크립터들은 파일의 입출력 및 오류를 처리함  

파일 디스크립터 약어 설명
0 STDIN 표준 입력
1 STDOUT 표준 출력
2 STDERR 표준 에러

 1) STDIN (표준 입력) 

   - STDIN 파일 디스크립터: 쉘의 표준 입력을 의미 
   - 터미널 인터페이스에서 표준 입력은 키보드 
   - 쉘은 키보드 입력을 STDIN 파일 디스크립터로부터 받으면 입력하는 각 문자들을 처리함 
   - 입력 리다이렉트(<)와 STDIN 
     : 입력 리다이렉트 기호를 사용하면 리눅스는 표준 입력 파일 디스크립터를 리다이렉트가 가리키는 파일로 바꿈 
     : 표준 입출력이었던 키보드로부터 입력을 받는 것이 아니라 파일을 읽어드림으로써 입력을 받음 
     

 2) STDOUT (표준 출력) 

   - STDOUT 파일 디스크립터: 쉘의 표준 출력을 의미 
   - 터미널 인터페이스에서 표준 출력은 터미널 모니터 
   - 출력 리다이렉트(>)를 사용함으로써, 출력 대상을 변경할 수 있다. 
    ex) 모니터로 출력되어야 할 출력물을 파일로 저장

3) STDERR (표준 에러) 

 - 쉘은 입출력과 별개로 오류 메시지를 처리함 
 - STDERR 파일 디스크립터: 쉘 또는 쉘에서 실행되는 프로그램이 만들어낸 오류 메시지를 보내는 장소
 - STDERR 파일 디스크립터는 기본적으로 STDOUT 파일 디스크립터와 같은 곳 (모니터)를 가리킴 

1. 출력 리다이렉트

1) 기호: > 
2) syntax: command > outputfile 
   -
command에 의해 출력된 결과물을 outputfile에 저장함 
   - ">" 기호로 하면 이전에 outputfile이 있을 경우 덮어쓰기를 함 
   - 기존에 있는 outputfile에 출력물을 덧붙이려면 ">>"를 사용하면 된다: command >> outputfile

3) 오류만 리다이렉트 하기 
   - syntax: command 2> output_file
   - 리다이렉트 기호(>) 앞에 숫자 2(STDERR 파일 디스크립터를 의미)를 붙여씀
   ex) 

$ ls -la badfile 2> test
$ cat test
ls: cannot access 'badfile': No such file or directory

   NOTE: 에러 메시지가 모니터에 출력되지 않고 test란 파일에 저장이 되었다. 

4) 오류 및 데이터 모두를 리다이렉트 하기 
    - 오류 및 데이터를 각각 다른 파일로 리다이렉트 하는 경우
      syntax: command 2> err_file 1> data_file 
       --- "1>" 을 사용하여 정상 출력을 data_file로 리다이렉트 시킴 
       --- "2>"를 사용하여 에러 메시지를 err_file로 리다이렉트 시킴  
    - 오류 및 데이터를 모두 같은 파일로 리다이렉트 시키는 경우 
      syntax: command &> output 
       --- "&>" 기호를 쓰게 되면, 명령이 만들어낸 모든 출력 (에러 메시지 및 데이터)들이 같은 장소로 전송된다.  

 

 

 

2. 입력 리다이렉트 

파일의 내용을 받아서 명령으로 보냄 
1) syntax: command < inputfile  

※ NOTE: 리다이렉트의 기호의 방향은 부등호가 아닌 데이터의 흐름 방향을 의미함 

인라인 입력 리다이텍트 (<<) 
인라인 입력 리다이렉트를 사용하면 파일대신 커맨드라인으로 입력 리다이렉트를 할 데이터를 지정할 수 있음 
1) syntax:

$ command  << marker 
data 
maker 

- 입력에 쓸 데이터와 데이터의 시작과 끝을 지정하는 텍스트 마커를 정해야 함. 
- 텍스트 마커로는 어떤 문자를 사용해도 상관없지만 끝과 시작이 반드시 동일한 값이어야 함 
- 많은 경우 텍스트 마커로 EOF 문자를 사용함 

파이프라인

1) syntax: command1 | command2 
2) 파이프 라인은 두 개의 명령을 연속적으로 실행하는 것이 아니다. 첫번째 명령을 실행 후, 첫번째 명령의 출력물을 즉시 두번째 명령에 전송한다. 이때 데이터를 전송하는데 중간 파일이나 버퍼 영역도 사용하지 않는다. 

 

1) #cat sample.c   
   - sample.c
이라는 파일의 내용을 표준 출력 장치를 통해 나타내라는 의미
2) #cat > sample.txt
   -
표준 입력장치의 입력을 sample.c라는 파일로 보내라는 의미
3) #cat sample1.c sample2.c > sample3.c
   - sample1.c
sample2.c의 파일 내용을 sample3.c에 보내어 출력
4) #cat < sample1.c > sample2.c
   - sample1.c
의 파일을 입력받아 sample2.c라는 파일로 출력
5)

2. 입출력 지정자

재지정자 기능
cmd1 | cmd2 cmd1의 표준 출력을 cmd2의 표준 입력으로 받는다
> file 표준 출력을 file로 전환
< file 표준 입력을 file로부터 받음
>> file 표준 출력을 file로 전환하고, file이 있으면 추가함
>| file Noclobber가 설정되어도 포준 출력을 file로 강제 전환함
   

 

3. 명령어의 연결
-
여러 개의 명령을 연결하기 위해서 사용되는 기호들을 사용함

기호 의미
명령어1 && 명령어 2 명령어 1이 성공하면 명령어 2가 실행
명령어 1 || 명령어 2 명령어 1이 실패하면 명령어 2가 실행됨
명령어 1 ;(semicolon) 명령어 2 명령어 1을 실행 후 명령어 2를 실행함

4. 파이프
-
명령의 출력을 파일에 리다이렉트하는 대신 출력을 다른 명령으로 리다이텍트할 수 있다. 이러한 과정을 파이프라고 한다.
-
명령 형태: “command 1” | “command 2”
- 1)
두 개의 명령이 연속으로 실행되는 것이 아니라, 리눅스 시스템에서 내부적으로 이 두 명령을 결합하고 동시에
   
실행시킴
 2)
첫번째 명령은 출력을 생성하고 두번째 명령에 즉시 전송되며, 이 과정에서 어떠한 중간파일이나 버퍼영역이 사용되지 않음  
-
명령에 사용할 수 있는 파이프의 개수에는 제한이 없음

728x90

댓글