여기서 중복 은 정말 중요한 부분입니다.
리디렉션 전에 파일 디스크립터가 어디로 가는지 봅시다. 이것은 일반적으로 현재 터미널입니다. 예 :
STDOUT ---> /dev/pts/1
STDERR ---> /dev/pts/1
이제 ls -l리디렉션없이 전화하면 출력 및 오류 메시지가 아래 터미널로 이동합니다 /dev/pts/1.
먼저 STDOUT파일을 파일 ( ls -l > dirlist)로 리디렉션하면 다음과 같습니다.
STDOUT ---> /home/bon/dirlist
STDERR ---> /dev/pts/1
그런 다음 파일 설명자 ( ) 의 복제본 으로 리디렉션 하면 다음STDERR 의 복제본 으로 이동합니다 .STDOUTls -l > dirlist 2>&1STDERR/home/bon/dirlist
STDOUT ---> /home/bon/dirlist
STDERR ---> /home/bon/dirlist
우리가 할 경우 첫 번째 리디렉션 STDERR의 중복에 STDOUT의 파일 기술자 ( ls -l 2>&1) :
STDOUT ---> /dev/pts/1
STDERR ---> /dev/pts/1
그리고 다음 STDOUT 파일 (에 ls -l 2>&1 > dirlist), 우리는이를 얻을 것입니다 :
STDOUT ---> /home/bon/dirlist
STDERR ---> /dev/pts/1
여기, STDERR여전히 터미널로 가고 있습니다.
맨 페이지의 순서가 정확하다는 것을 알 수 있습니다.
테스트 리디렉션
이제 직접 테스트 해 볼 수 있습니다. 를 사용 하면 현재 프로세스 ls -l /proc/$$/fd/에서 STDOUT(fd 1) 및 STDERR(fd 2)가 어디로 가고 있는지 볼 수 있습니다.
$ ls -l /proc/$$/fd/
total 0
lrwx------ 1 bon bon 64 Jul 24 18:19 0 -> /dev/pts/1
lrwx------ 1 bon bon 64 Jul 24 18:19 1 -> /dev/pts/1
lrwx------ 1 bon bon 64 Jul 24 07:41 2 -> /dev/pts/1
lrwx------ 1 bon bon 64 Jul 24 18:19 255 -> /dev/pts/1
파일 디스크립터가 가리키는 위치를 나타내는 작은 쉘 스크립트를 작성해 봅시다. 이런 식으로, 우리는 항상 호출 할 때 상태를 얻습니다 ls.
$ cat > lookfd.sh
#!/bin/sh
ls -l /proc/$$/fd/
^D
$ chmod +x lookfd.sh
(을 사용하면 CtrlD파일 끝을 보내므로 cat에서 읽기 명령을 중지하십시오 STDIN.)
이제 다양한 조합의 리디렉션으로이 스크립트를 호출하십시오.
$ ./lookfd.sh
total 0
lrwx------ 1 bon bon 64 Jul 24 19:08 0 -> /dev/pts/1
lrwx------ 1 bon bon 64 Jul 24 19:08 1 -> /dev/pts/1
lrwx------ 1 bon bon 64 Jul 24 19:08 2 -> /dev/pts/1
lr-x------ 1 bon bon 64 Jul 24 19:08 255 -> /home/bon/lookfd.sh
$ ./lookfd.sh > foo.out
$ cat foo.out
total 0
lrwx------ 1 bon bon 64 Jul 24 19:10 0 -> /dev/pts/1
l-wx------ 1 bon bon 64 Jul 24 19:10 1 -> /home/bon/foo.out
lrwx------ 1 bon bon 64 Jul 24 19:10 2 -> /dev/pts/1
lr-x------ 1 bon bon 64 Jul 24 19:10 255 -> /home/bon/lookfd.sh
$ ./lookfd.sh 2>&1 > foo.out
$ cat foo.out
total 0
lrwx------ 1 bon bon 64 Jul 24 19:10 0 -> /dev/pts/1
l-wx------ 1 bon bon 64 Jul 24 19:10 1 -> /home/bon/foo.out
lrwx------ 1 bon bon 64 Jul 24 19:10 2 -> /dev/pts/1
lr-x------ 1 bon bon 64 Jul 24 19:10 255 -> /home/bon/lookfd.sh
$ ./lookfd.sh > foo.out 2>&1
$ cat foo.out
total 0
lrwx------ 1 bon bon 64 Jul 24 19:11 0 -> /dev/pts/1
l-wx------ 1 bon bon 64 Jul 24 19:11 1 -> /home/bon/foo.out
l-wx------ 1 bon bon 64 Jul 24 19:11 2 -> /home/bon/foo.out
lr-x------ 1 bon bon 64 Jul 24 19:11 255 -> /home/bon/lookfd.sh
파일 디스크립터 1 (for STDOUT) 및 2 (for STDERR)가 다양 함을 알 수 있습니다. 재미있게도 리디렉션 STDIN하고 결과를 볼 수 있습니다.
$ ./lookfd.sh < /dev/zero
total 0
lr-x------ 1 bon bon 64 Jul 24 19:18 0 -> /dev/zero
lrwx------ 1 bon bon 64 Jul 24 19:18 1 -> /dev/pts/1
lrwx------ 1 bon bon 64 Jul 24 19:18 2 -> /dev/pts/1
lr-x------ 1 bon bon 64 Jul 24 19:18 255 -> /home/bon/lookfd.sh
(독자에게 남은 질문 : 파일 디스크립터 255는 어디에 있습니까? ;-))