파일 설명자 중복 동작

파일 설명자 중복 동작

나는 이 파일을 가지고 있습니다 :

1
2
3
4

내가 paste이쪽으로 달릴 때

paste - - <file

이 결과

1       2
3       4

지금까지는 표준 입력(에서 리디렉션됨 file)이 두 번 전달되므로 paste홀수 라인과 짝수 라인이 쌍으로 인쇄됩니다.

그러나 이것이 다음과 같이 변경되면

paste - /dev/fd/0 <file

출력은

1       1
2       2
3       3
4       4

pastefile매개 변수 -에 대해 한 번, /dev/fd/0.

나는 이것을 설명할 수 없다 - 내가 번역하고 있었다면이것올바르게, -및 둘 다 /dev/fd/0단일 커널 파일 테이블 항목을 참조해야 하므로 paste이전 사례와 동일한 결과를 생성해야 합니다.

답변1

이것은 Linux에만 해당됩니다. 대부분의 Unices에서 열기는 (파일 설명자를 가져오는 것과 /dev/fd/n거의 동일합니다 )dup(n)파일 설명 열기fd 와 동일 n), Linux에서는 /dev/fd/n파일 설명자에서 열린 파일에 대한 심볼릭 링크입니다 n.

따라서 Linux에서는 다음과 같습니다.

paste - /dev/fd/0 < file

동일합니다:

paste - file < file

(또는 paste file file).

두 개의 fd(0과 -open or를 통해 얻은 자체 파일)는 독립적이며 파일에 자체 커서가 있습니다./dev/fd/0file

또한 Linux에서는 소켓과 함께 /dev/fd/n을 사용할 수 없다는 점도 알 수 있습니다.

일반적으로 Linux에서는 파이프에만 사용하려고 합니다 /dev/fd/n. 하지만 이 경우에는

cat file | paste - /dev/fd/0

(또는 Linux 기반이 아닌 운영 체제로 전환하는 것)은 실제로 도움이 되지 않습니다. 두 경우 모두 표준 입력으로 알려져 있기 paste - -때문에 작동합니다 . paste하지만 여기서는 아니므로 (fd 0에서 파이프까지)에서 (한 줄 대신) 전체 블록을 읽은 -다음 /dev/fd/0에서 다른 블록을 (Linux의 별도 fd에서 동일한 파이프로 읽습니다. fd 동일한 것을 가리키는지 여부파일 설명 열기또는 파이프라인에는 중요하지 않습니다.) 두 가지 모두 read()파일의 다른 부분을 읽지만 한 번에 몇 줄씩 읽습니다.

에서 한 줄을 읽기 전에 한 줄 이상 읽지 않도록 paste한 번에 한 바이트씩 읽도록 지시해야 합니다 . 이는 아마도 다시 컴파일하지 않고는 불가능할 것입니다. 표준 입력을 한 번에 한 바이트씩 읽을 수 있지만 아마도 그렇지 않을 수도 있습니다 .-/dev/fd/0pastestdbuf/dev/fd/0

$ cat file | paste - /dev/fd/0
1
2
3
4
$ cat file | stdbuf -i1 paste - /dev/fd/0
1       2
        3
        4

관련 정보