3> & 1은 4> & 3 5> & 3 등을 의미합니까?


31

나는 기대할 것이다

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

이 동작에 대한 설명이 있습니까?

답변:


31

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.