입출력 방향 지정(I/O 리다이렉션)
I/O는 입/출력을 뜻하고, 명령은 리다이렉션을 통해 파일을 입력받을 수 있고, 또한 파일로 출력할 수 있다. 뿐만 아니라 강력한 명령어 파이프라인을 만들기 위해서 필요한 명령어들을 연결할 수 있다.
- cat : 파일 연결하기
- sort : 텍스트 라인 정렬
- uniq : 중복 줄을 알리거나 생략하기
- wc : 각 파일의 개행 및 단어 개수, 파일 바이트 출력하기
- grep : 패턴과 일치하는 라인 출력하기
- head : 파일 첫 부분 출력하기
- tail : 파일 마지막 부분 출력하기
- tee : 표준 입력을 읽고 표준 출력 및 파일에 쓰기
파일 입출력과 표준 오류
ls와 같은 프로그램은 사실 표준 출력(stdout) 이라고 불리는 특수한 파일에 이 명령어에 대한 결과를 보내고 표준 오류(stderr) 라는 또 다른 파일에 그 상태 메시지를 전송한다. 기본적으로 표준 출력과 오류 모두 화면에 열결되어 있고 디스크 파일에 따로 저장되지 않는다.
많은 프로그램들이 표준 입력(stdin)이라고 부르는 곳에서 입력 내용을 가져오고 그것은 기본적으로 키보드에 직접 연결되어 있다.
입출력 방향 지정(I/O 리다이렉션)기능으로 출력과 입력의 방향을 변경할 수 있다. 일반적으로 출력은 화면에 나타나고 입력은 키보드로부터 인식되지만 I/O 리다이렉션으로 이러한 방식을 변경할 수 있다.
표준 출력 재지정
I/O 리다이렉션은 출력 방향을 재정의할 수 있다.
화면에 출력하는 것이 아니고 파일에 출력되도록 지정하기 위해서 파일명 앞에 >
리다이렉션 연산자를 사용하면 된다.
# ls -l /usr/bin > ls-output.txt
=> /usr/bin 디렉토리에 있는 파일들을 ls-output.txt파일로 내보내겠다.
# ls -l /ttt > ls-output.txt
ls: /ddd: No such file or directory
/ttt 라는 존재하지 않는 디렉토리를 입력해보면 오류메시지가 출력되는 것을 볼 수 있다. 하지만 이 오류 메시지는 ls-output.txt에 남지 않는다.
그 이유는 오류 메시지는 표준 출력으로 전송하지 않고 표준 오류로 전송하기 때문이다. 우리는 표준 오류가 아닌 표준 출력만 재정의했기에 오류메시지는 여전히 화면에 나타나게 된다.
만약 파일을 덮어쓰는 대신 출력할 내용을 파일에 이어서 작성하려면 >> 연산자를 사용하면 된다.
# ls -l /user/bin >> ls-output.txt
표준 오류 재지정
표준 오류를 재지정할 때는 파일 디스크립터를 참조한다. 프로그램은 번호로 지정된 파일 스트림 중에 어디에라도 출력을 할 수 있다.
쉘은 내부적으로 0(표준 입력), 1(표준 출력), 2(표준 오류) 번호로 파일 디스크립터로 표현한다.
- 파일 디스크립터(File Descriptor) : 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값
표준 오류는 파일 디스크립터2와 같기 떄문에 표준 오류를 재지정할 때 아래 표기법을 사용할 수 있다.
# ls -l /ttt 2> ls-error.txt
파일 디스크립터 2는 리다이렉션 연산자 바로 앞에 위치하고 ls-error.txt 파일에 표준 오류 메시지를 보낸다.
표준 출력과 표준 오류를 한 파일로 재지정
명령어의 결과를 모두 한 파일에 저장하고 싶은 경우, 동시에 표준 출력과 표준 오류를 재지정해야 한다.
# ls -l /ttt > ls-output.txt 2>&1
이 명령어는 두번의 리다이렉션이 이뤄진다.
먼저 표준 출력이 ls-output.txt 파일로 재지정되고, 2>&1
의 입력으로 파일 디스크립터2(표준 오류)가 파일 디스크립터1(표준 출력)로 재지정되도록 한다.
=> 현재 표준 출력파일은 ls-output.txt
리다이렉션관련 순서
표준 오류의 재지정은 항상 표준 출력을 재지정한 뒤에 이루어져야 한다.
그렇지 않으면 올바르게 동작하지 않을 가능성이 있다.
# ls -l /ttt > ls-output.txt 2>&1 ## 표준 오류를 ls-output.txt 파일로 재지정
# ls- l /ttt 2>&1 ls-output.txt ## 표준 오류의 출력 방향은 화면이 된다.
간소화 방법
# ls -l /ttt &> ls-output.txt
원치 않는 출력 제거
오류 및 상태메시지를 출력하고 싶지 않을 경우가 있는데, 이럴 경우 시스템은 /dev/null이라는 특수한 파일로 출력 방향을 지정함으로써 이문제를 해결할 수 있다. 이 파일은 비트 버킷(bit bucket)이라고 불리는 시스템 장치로 입력을 받고 아무것도 수행하지 않는다.
# ls -l /ttt 2> /dev/null ## 오류 메시지를 출력하지 않는다.
'프로그래밍 노트 > Linux' 카테고리의 다른 글
curl 를 통해서 SSL 인증서 보기 (0) | 2020.03.03 |
---|---|
리눅스 파일 검색(find) (0) | 2020.02.10 |
rsync 사용법[데이터 백업, 원격 전송] (0) | 2020.02.10 |
쉘스크립트 흐름제어 (if, while, case) (0) | 2019.12.12 |
쉘 스크립트란? (0) | 2019.12.12 |