나는 이 파일을 가지고 있습니다 :
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
paste
file
매개 변수 -
에 대해 한 번, /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/0
file
또한 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/0
paste
stdbuf
/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