리눅스 리다이렉션
IT위키
더 많은 작업
- 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 는 덧붙인다.