표준 입출력 장치
- 표준 입력 장치: 셸이 작업을 수행하는 데 필요한 정보를 받아들이는 장치
- 표준 출력 장치: 실행 결과(오류 메세지 제외 정상출력만)를 내보내는 장치
- 표준 오류 장치: 표준 출력과 별도로 오류 메세지를 내보내는 장치
파일 디스크립터 | 파일 디스크립터 대신 사용하는 이름 | 정의 |
0 | stdin | 명령의 표준 입력 |
1 | stdout | 명령의 표준 출력 |
2 | stderr | 명령의 표준 오류 |
파일 디스크립터
리눅스는 장치도 파일로 관리하며 파일마다 일련번호를 붙여서 관리하고 이 번호가 파일 디스크립터이다.
출력 리다이렉션 >, >>
파일 덮어쓰기 >
명령 1> 파일명
명령 > 파일명
여기서 1
은 파일 디스크립터 1번을 의미한다. 즉, 지정한 파일을 1번 파일로 간주하겠다는 것이다. 1번이 표준 출력(콘솔)이므로 이를 대신하여 지정한 파일을 사용한다는 것은 결과적으로 표준 출력의 공간이 해당 파일로 바뀌는 것
을 의미한다.
ls -al
명령의 표준 출력 값을 out1로 리다이렉션 해 저장한다. out1 파일이 없기 때문에 새로 생성되었다.
date
명령의 표준 출력 값을 out1로 리다이렉션 해 저장한다. 이 때는 out1 파일이 있기 때문에 overwrite 되었다.
set 명령을 사용하면 예상치 않게 파일 내용을 덮어쓰는 일을 예방할 수 있다. 항상 적용하기 위해서는 사용자 초기화 파일에 해당 설정을 추가하면 된다. 해제를 위해서는 +옵션을 사용한다.
set -o 옵션을 이용해서 사용자 파일에 덮어쓰지 못하도록 추가해주었다. set 옵션은 일회성임에 유의해야 한다.
set +o 옵션을 이용해서 사용자 파일에 덮어쓰는 게 가능해졌으므로 >을 사용해도 에러가 나오지 않는다.
파일에 내용 추가하기 >>
명령 >> 파일명
>과는 파일을 덮어쓰지 않고 뒤에 이어 붙여준다는 차이점만 있다.
오류 리다이렉션 2>
명령 2> 파일명
ls 명령의 표준 출력을 ls.out에 저장하고 ls /abc의 표준 출력을 ls.err에 저장한다.
ls /abc는 표준 에러만 발생하기 때문에 >
을 이용했을 때는 ls.err에 아무 값도 저장되지 않는다.
2>
을 이용해야 표준 에러가 ls.err에 저장되는 것을 볼 수 있다.
표준 출력과 표준 오류 한 번에 리다이렉션
>
와 2>
을 한 줄에 입력해서 표준 출력과 표준 에러를 한 번에 각각 다른 파일로 리다이렉션 할 수 있다.
오류 메시지 버리기
ls /abc의 표준 에러를 /dev/null에 출력시켜서 오류 메시지를 버렸다.
/dev/null은 리눅스에서 사용하는 특수 파일인데, 이 파일에 담긴 내용은 복구할 수 없이 버려진다. 필요 없는 내용을 거르고 싶을 때 사용한다.
표준 출력과 표준 오류를 한 파일로 리다이렉션 2>&1
>
을 이용해 ls . /abc의 표준 출력(정상 결과)를 ls.out 파일로 리다이렉션한다.
ls . /abc > ls.out
명령의 오류 메세지를 1번 파일(표준 출력 파일, &1)로 리다이렉션(2>)한다.
입력 리다이렉션 <
명령 0< 파일명
명령 < 파일명
cat
은 파일의 내용이나 키보드로 입력받은 값을 화면에 출력하는 명령이다. 매번<
을 붙이는 것이 번거로우므로 <을 붙이는 것을 생략해서 사용하는 것이다.
1번은 cat 명령에 대한 표준 입력을 out1로 지정(<이 생략됨, 보통 이렇게 사용)
2번도 마찬가지로 cat 명령에 대한 표준 입력을 out1로 지정
3번은 cat 명령의 결과값에 대한 표준 출력(지정된 표준 입력 파일이 없으므로 키보드 입력을 받음)를 out1에 저장(>
이용)
4번은 cat 명령에 대한 표준 입력을 out1로 지정. 3번에 의해 out1의 내용이 변경된 것을 볼 수 있다.