리다이렉션
쉽게 말하면
명령 결과는 원래 화면에 나오지만, 기호(>)를 붙이면 화면 대신 파일에 저장할 수 있어요. 결과와 오류 메시지는 서로 다른 통로로 나와서, 오류만 따로 파일에 담을 수도 있어요.
시험용 정의
리다이렉션은 명령의 표준 입력·출력·오류의 방향을 화면(키보드) 대신 파일로 바꾸는 기능이다. 번호는 표준 입력 0, 표준 출력 1, 표준 오류 2.
비유로 이해하기
수도관의 방향 밸브다. 원래 싱크대(화면)로 나오던 물을 양동이(파일)로 돌린다. 깨끗한 물(1)과 흙탕물(2)은 관이 따로 있다.
자세히
표준 입력·출력·오류란
프로그램은 시작할 때 통로 세 개를 기본으로 받는다. 커널은 프로세스가 연 파일·통로에 0, 1, 2 … 번호를 붙여 구분하는데, 이 번호를 파일 디스크립터(FD)라고 한다.
- 0 표준 입력(stdin): 프로그램이 읽는 곳. 기본은 키보드
- 1 표준 출력(stdout): 정상 결과를 쓰는 곳. 기본은 화면
- 2 표준 오류(stderr): 오류 메시지를 쓰는 곳. 기본은 화면
출력과 오류가 둘 다 화면에 나와서 같아 보이지만 다른 통로다. 그래서 >(= 1>)로 결과만 파일에 보내면 오류는 여전히 화면에 나오고, 오류까지 보내려면 2>를 따로 써야 한다. 리다이렉션은 이 통로의 연결 대상을 키보드·화면에서 파일로 바꾸는 것이다.
기호 정리
| 기호 | 뜻 |
|---|---|
| 명령 > 파일 | 표준 출력을 파일로 (덮어쓰기) |
| 명령 >> 파일 | 표준 출력을 파일 끝에 덧붙이기 |
| 명령 < 파일 | 파일을 표준 입력으로 |
| 명령 2> 파일 | 표준 오류를 파일로 |
| 명령 2>> 파일 | 표준 오류 덧붙이기 |
| 명령 > 파일 2>&1 | 출력과 오류를 모두 같은 파일로 (순서 중요) |
| 명령 &> 파일 | 출력과 오류 모두 (bash 축약) |
| 명령 2> /dev/null | 오류를 버리기 |
| 명령 << 끝 | here document: 다음 줄부터 '끝'이 나올 때까지를 입력으로 |
| 명령 <<< "문자열" | here string: 문자열을 입력으로 |
2>&1의 순서 함정
cmd > out.txt 2>&1: 먼저 1번을 파일로 돌리고, 2번을 "1번이 가는 곳"으로 → 둘 다 파일로. cmd 2>&1 > out.txt: 2번을 당시의 1번(화면)으로 먼저 돌린 뒤 1번만 파일로 → 오류는 여전히 화면에.
덮어쓰기 방지
set -o noclobber를 켜면 >로 기존 파일을 덮어쓰지 못한다. 그래도 강제로 덮어쓰려면 >|. 끄기는 set +o noclobber.
시험에 이렇게 나와요
- 덮어쓰기
>, 이어 쓰기>>, 오류만2>, 출력과 오류 함께> 파일 2>&1, 입력< - 출력을 버리기 →
/dev/null
확인 문제
Q1. find / -name passwd > result.txt를 실행했더니 화면에 Permission denied가 잔뜩 나오고 result.txt에는 찾은 결과만 들어갔다. 왜일까?
- > 는 표준 출력(1)만 파일로 보내고, 오류는 표준 오류(2)라 화면에 남았다
- result.txt 용량이 모자랐다
- Permission denied는 파일에 쓸 수 없는 글자다
- find가 고장 났다
정답 보기
1번 > 는 표준 출력(1)만 파일로 보내고, 오류는 표준 오류(2)라 화면에 남았다
프로그램의 출력은 표준 출력(1번)과 표준 오류(2번)로 나뉜다. >는 1번만 돌린다. 오류까지 파일로 보내려면 2>나 2>&1이 필요하다. 오류를 버리려면 2>/dev/null.
Q2. 명령의 표준 오류만 error.log에 덧붙이는 것은?
- cmd > error.log
- cmd &>> error.log
- cmd 2>> error.log
- cmd 2> error.log
정답 보기
3번 cmd 2>> error.log
2>> (덧붙이기). 2>는 덮어쓰기, &>>는 출력과 오류 모두.
Q3. 표준 출력과 표준 오류를 모두 out.txt에 저장하는 올바른 형태는?
- cmd > out.txt 2>&1
- cmd < out.txt 2>&1
- cmd 1>&2 out.txt
- cmd 2>&1 > out.txt
정답 보기
1번 cmd > out.txt 2>&1
파일로 1을 먼저 돌리고 2를 1로.
Q4. 표준 입력·출력·오류의 파일 디스크립터 번호로 옳은 것은?
- 0, 1, 2
- 1, 2, 3
- 0, 2, 1
- 1, 0, 2
정답 보기
1번 0, 1, 2
stdin 0, stdout 1, stderr 2.
헷갈리기 쉬운 O·X
> 는 기존 파일 내용 뒤에 덧붙인다.
정답 보기
X > 는 덮어쓰기, >> 가 덧붙이기.
/dev/null로 보낸 출력은 버려진다.
정답 보기
O 맞는 설명이다.
set -o noclobber를 켜면 > 로 기존 파일을 덮어쓸 수 없다.
정답 보기
O 맞는 설명이다.