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) 첫번째 명령은 출력을 생성하고 두번째 명령에 즉시 전송되며, 이 과정에서 어떠한 중간파일이나 버퍼영역이 사용되지 않음
- 명령에 사용할 수 있는 파이프의 개수에는 제한이 없음
'프로그래밍 언어 > Shell script(BASH)' 카테고리의 다른 글
[Shell Script] 함수 만들기 (0) | 2021.06.08 |
---|---|
[Shell script] 여러 개의 사용자 계정 만들기 (0) | 2021.06.03 |
[Shell scripts] 기본적인 스크립트 제어 (if, for, where, case) (0) | 2021.05.17 |
[Shellscript] 정수 및 실수 연산 (0) | 2021.04.20 |
[Shellscript] 쉘, 쉘 스크립트 및 쉘 변수 (BASH) (0) | 2021.04.20 |
댓글