본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Redirection; 입출력 재지정
명령의 표준 입력·표준 출력·표준 오류가 향하는 곳을 키보드·화면 대신 파일(또는 다른 파일 디스크립터)로 바꾸는 셸 기능

셸에서 실행한 명령은 기본적으로 세 개의 파일 디스크립터를 갖고 시작한다. 0번 표준 입력(stdin)은 키보드, 1번 표준 출력(stdout)과 2번 표준 오류(stderr)는 화면이다. 리다이렉션 기호를 쓰면 명령을 고치지 않고도 이 연결을 파일로 돌릴 수 있다. 출력은 화살표가 가리키는 쪽으로 흐른다고 기억하면 된다. > 는 명령에서 파일로, < 는 파일에서 명령으로 데이터가 간다.

리다이렉션은 명령어가 아니라 셸이 해석하는 문법이다. 셸은 명령을 실행하기 전에 기호를 읽어 파일을 열고 디스크립터를 바꿔 끼운 뒤 명령을 실행한다. 명령의 출력을 다른 명령의 입력으로 넘기는 것은 파이프(|)이며 리다이렉션과 구분한다.

기호 뜻 파일이 이미 있으면 예
> 표준 출력을 파일로 보낸다 내용을 지우고 새로 쓴다(덮어쓰기). 없으면 만든다 ls -al > output.txt
>> 표준 출력을 파일 끝에 덧붙인다(append) 기존 내용을 그대로 두고 뒤에 이어 쓴다. 없으면 만든다 date >> log.txt
< 파일 내용을 명령의 표준 입력으로 넣는다 파일은 읽기만 한다 sort < names.txt
<< 히어 도큐먼트. 다음 줄부터 지정한 끝 표시까지를 표준 입력으로 넣는다 파일을 쓰지 않는다 cat << EOF
<<< 히어 스트링(bash). 뒤의 문자열 하나를 표준 입력으로 — bc <<< "3*4"
2> 표준 오류를 파일로 보낸다(덮어쓰기) 덮어쓴다 find / -name a 2> err.txt
2>> 표준 오류를 파일에 덧붙인다 이어 쓴다 cmd 2>> err.log
> 파일 2>&1 표준 출력과 표준 오류를 같은 파일로 덮어쓴다 cmd > all.log 2>&1
&> bash 에서 위와 같은 뜻의 줄임 덮어쓴다 cmd &> all.log
  • "결과를 파일로 저장하되 덮어쓰고 덧붙이지 않는다"는 > 다. 덧붙이는 것은 >> 다.
  • < 와 << 는 입력 쪽 기호이므로 명령의 결과를 파일에 저장하지 못한다. ls -al < output.txt 는 output.txt 를 ls 의 입력으로 줄 뿐이고(ls 는 표준 입력을 읽지 않는다) 결과는 화면에 나온다.
  • bash 에서 set -o noclobber 를 켜면 > 가 기존 파일을 덮어쓰지 않고 오류를 낸다. 그래도 덮어쓰려면 >| 를 쓴다.
  • 2>&1 의 위치가 중요하다. cmd 2>&1 > f 는 표준 오류를 그때의 표준 출력(화면)에 붙인 뒤 표준 출력만 파일로 돌리므로 오류는 화면에 남는다.
  • 출력을 버릴 때는 /dev/null 로 보낸다. cmd > /dev/null 2>&1

히어 도큐먼트

편집 원본 편집
Here Document

스크립트 안에 여러 줄의 입력을 직접 적어 넣는 방법이다. << 뒤의 낱말(관례로 EOF)이 다시 한 줄에 단독으로 나올 때까지를 명령의 표준 입력으로 준다.

$ cat << EOF > hello.txt
첫째 줄
둘째 줄
EOF
  • 위 예는 히어 도큐먼트로 받은 두 줄을 > 로 hello.txt 에 저장한다. >> 로 바꾸면 파일 끝에 덧붙인다.
  • <<- 로 쓰면 각 줄 앞의 탭을 지운다. 끝 표시를 따옴표로 감싸면(<< 'EOF') 변수 치환이 일어나지 않는다.

화면과 파일에 동시에

편집 원본 편집

리다이렉션은 출력을 파일로 옮기므로 화면에는 아무것도 나오지 않는다. 화면에도 보이면서 파일에도 남기려면 tee 를 파이프로 잇는다. ls -al | tee output.txt 는 덮어쓰고, tee -a 는 덧붙인다.