나는 기대할 것이다
echo foo | tee /proc/self/fd/{3..6} 3>&1
/ proc / self / fd / 4 와 같은 오류로 실패 : 그러한 파일이나 디렉토리 등은 없지만 놀랍게도 출력합니다.
foo
foo
foo
foo
foo
그것은처럼 3>&1
내가 변경하는 경우가 작동하지 않는 제외한 모든 다음과 같은 설명이 표준 출력 리디렉션 원인 3
과 같은 다른 것으로,
$ echo foo | tee /proc/self/fd/{3..6} 4>&1
tee: /proc/self/fd/3: No such file or directory
tee: /proc/self/fd/5: No such file or directory
tee: /proc/self/fd/6: No such file or directory
foo
foo
$ echo foo | tee /proc/self/fd/{4..6} 4>&1
tee: /proc/self/fd/5: No such file or directory
tee: /proc/self/fd/6: No such file or directory
foo
foo
이 동작에 대한 설명이 있습니까?
답변
strace
이 일련의 시스템 호출을 보여줍니다.
$ strace -o strace.log tee /proc/self/fd/{3..6} 3>&1
...
$ cat strace.log
...
openat(AT_FDCWD, "/proc/self/fd/3", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
openat(AT_FDCWD, "/proc/self/fd/4", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 5
openat(AT_FDCWD, "/proc/self/fd/5", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6
openat(AT_FDCWD, "/proc/self/fd/6", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 7
...
첫 번째 줄이 열리고 /proc/self/fd/3
사용 가능한 다음 fd 번호 가 할당됩니다. 4. /proc/self/fd/3
특수 경로입니다. 그와 같은 효과 갖는 개방형 DUP ING 3, fd가 : FD 3 TTY 같은 장소에 4 포인트가 fd.
연속되는 각 openat()
호출 에 대해 동일한 일이 발생합니다 . 먼지가 침전되면 fd 4, 5, 6 및 7은 모두 fd 3의 복제품입니다.
- 1 → tty
- 3 → tty
- 4 → tty
- 5 → tty
- 6 → tty
- 7 → tty
있습니다 3>&1
리디렉션 중요하지 않습니다. 중요한 것은 N 이 이미 사용중인 /proc/self/fd/N
곳에 티를 열도록 요청 하는 것입니다. 우리가 제거 3>&1
하고 /proc/self/fd/2
대신 티를 시작 하면 동일한 결과를 얻어야 합니다. 보자 :
$ echo foo | tee /proc/self/fd/{2..6}
foo
foo
foo
foo
foo
foo
확인했습니다! 같은 결과입니다.
동일한 fd 번호를 반복해서 반복 할 수도 있습니다. fd 6을 눌렀을 때도 같은 결과를 얻습니다. 마지막에 도달 할 때 6 개로 점프하기에 충분한 설명자를 열었습니다.
$ echo foo | tee /proc/self/fd/{2,2,2,2,6}
foo
foo
foo
foo
foo
foo