리눅스프로그래밍

우분투 리눅스 - 입출력 방향 바꾸기

헬로월드! 2020. 5. 8. 12:57

보통 키보드로 명령을 입력하고 실행 결과는 화면에 출력된다.

명령의 실행 결과를 파일로 저장하고 입력도 키보드가 아닌 파일에서 읽어오도록 할 수 있다.

입출력 장치를 바꾸면 된다! 

 

리눅스는 장치도 파일로 관리한다.

 

1. 파일 디스크립터 

- 파일 관리를 위해 붙이는 일련 번호

- 입출력 장치를 변경할 때는 이 파일 디스크립터를 사용한다.

- 표준 입출력 장치를 파일로 바꾸는 것을 리다이렉션이라고 한다.

파일 디스크립터 파일 디스크립터 대신 사용하는 이름 정의
0 stdin 명령의 표준 입력
stdout 명령의 표준 출력
2 stderr 명령의 표준 오류 

 

2. 출력 리다이렉션

> : 기존 파일의 내용을 삭제하고 새로 결과를 저장 (덮어쓰기)

>> : 기존 파일의 내용 뒤에 결과를 추가

 

파일 덮어쓰기 >

 기능 : 파일 리다이렉션(덮어쓰기)를 한다.

 형식 : 명령 1> 파일

         명령 > 파일 

 

- 1 : 파일 디스크립터 1번 (표준 출력 , 화면) => 표준 출력이 파일로 바뀌는 것을 의미한다. 파일 디스크립터 1은 생략 가능하며, 보통 1이 생략된 두 번째 형식을 사용한다. 

- 셸은 > 를 사용한 리다이렉션에서 저장한 이름의 파일이 없으면 파일을 생성해서 명령의 수행 결과를 저장 

- 파일이 있으면 이전 내용은 없어지고 명령 수행 결과로 대체 

 

- 예상치 않게 파일 내용을 덮어 쓰는 것을 예방 하는 법

set -o noclobber

이 설정을 해제하려면 set +o noclobber 를 이용한다. 

 

일반적으로 cat 명령은 파일의 내용을 화면에 출력할 때 사용한다. 하지만 cat 명령은 표준 입력으로 부터 입력을 받아 표준 출력으로 보낼 수도 있다.

cat > out1 

입력하면 커서가 사용자의 입력을 기다린다. 내용을 적절히 입력하고 ctrl +D 를 누르면 입력이 종료된다. 

 

파일에 내용 추가하기 >>

 기능: 파일에 내용을 추가한다.

 형식: 명령 >> 파일

 

>>를 사용한 출력 리다이렉션에서는 지정한 파일명의 파일이 없으면 파일을 생성하고, 해당 파일이 있으면 그 파일의 내용의 끝에 명령 실행 결과를 추가한다.  

 

3. 오류 리다이렉션

명령을 실행하는 과정에서 셸 화면에 출력되는 메시지는 두개! 하나는 명령이 정상적으로 실행된 결과이고 또 하나는 명령 실행 중 발생하는 오류 메시지이다. 표준 오류도 기본적으로 화면에 출력되며 표준 출력처럼 리다이렉션할 수 있다. 

 

2>

 기능 : 표준 오류 메시지를 파일에 저장한다.

 형식: 명령 2> 파일

  

 오류 리다이렉션에서는 파일 디스크립터 번호를 생략할 수 없다. 

 

1) 표준 출력과 표준 오류를 한 번에 리다이렉션하기

: 명령의 정상적인 실행 결과와 오류 메시지를 한 번에 리다이렉션하여 각각 파일에 저장하려면 > 와 2> 를 함께 사용한다.

 

ls . /abc > ls.out 2> ls.err

ls . /abc 명령이 오류가 안나면 => ls.out 으로

                           오류가 나면 => ls.err 으로 결과를 파일에 저장한다! 

 

2) 오류 메시지 버리기

명령 실행 중 나타나는 오류 메시지를 무시하고 싶을 때, 리눅스 특수 파일인 /dev/null 을 사용하면 된다.

/dev/null => 버리고 싶은 내용을 담는 장치파일 (휴지통)

이 파일로 전달된 모든 내용은 시스템에서 사라지기 때문에 복구가 불가능하다. 

ls /abc 2> /dev/null

 

3) 표준 출력과 표준 오류를 한 파일로 리다이렉션하기

 

이때 2> 와 &1 사이에는 공백이 있으면 안된다. 

ls . /abc > ls.out 2>&1

명령의 정상 실행 결과를 파일로 리 다이렉션하고 , 그 명령 전체의 오류 메시지를 1번 파일로 리다이렉션한다.

그러면 ls.out 에 정상 실행과 오류 실행 모두 들어가는 것을 알 수 있다. 

 

입력 리다이렉션 <

 기능 : 표준 입력을 바꾼다.

 형식: 명령 0< 파일

           명령 < 파일