프로세스 대체가 파이프 인 / dev / fd / 63이라는 파일을 생성하는 이유는 무엇입니까?


40

이 특정 예제의 맥락에서 명명 된 파이프를 이해하려고합니다.

<(ls -l)터미널에 입력 하고로 출력을 얻습니다 bash: /dev/fd/63: Permission denied.

을 입력 cat <(ls -l)하면 디렉토리 내용을 볼 수 있습니다. 나는 교체하는 경우 cat와를 echo, 내가 터미널 이름을 얻을 생각 (또는인가?).

echo <(ls -l)출력을로 제공합니다 /dev/fd/63.

또한이 예제 출력은 명확하지 않습니다.

ls -l <(echo "Whatever")
lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -> pipe:[48078752]

그러나 내가 주면 ls -l <()디렉토리 내용이 나와 있습니다.

명명 된 파이프의 경우 어떻게됩니까?

답변:


37

당신이 할 때 <(some_command), 쉘은 괄호 안의 명령을 실행하고 모든 것을 파일 설명 자로 대체합니다. /dev/fd/63ls 호출의 출력을 포함하는 파이프도 마찬가지 입니다.

당신이 할 때 <(ls -l)당신이 얻을 Permission denied전체 라인이 효과적으로 전화를 시도, 파이프로 대체되기 때문에, 오류를 /dev/fd/63실행하지 않은 명령으로.

두 번째 예에서는 cat <(ls -l)이됩니다 cat /dev/fd/63. cat이 매개 변수로 제공된 파일에서 읽을 때 컨텐츠를 얻습니다. echo반면에 매개 변수는 "있는 그대로"출력합니다.

당신이 가진 마지막 경우 <()는 명령이 없으므로 단순히 아무것도 대체하지 않습니다. 그러나 이것은 쉘간에 일관성이 없으며 zsh에서는 여전히 파이프를 얻습니다 (비어 있지만).

요약 : <(command)일반적으로 파일이 필요한 명령 출력을 사용할 수 있습니다.

편집 :질이 지적이 아닌 명명 된 파이프하지만, 익명 파이프입니다. 가장 큰 차이점은 프로세스가 실행되는 동안에 만 존재하지만 명명 된 파이프 (예 :로 작성 mkfifo)는 프로세스가 첨부되지 않은 상태로 유지된다는 것입니다.


5
mkfifo내용없이 명명 된 파이프 만 만듭니다. 따라서 직접 작성해야합니다 (예 :) mkfifo mypipe; ls > mypipe. 그리고 예, 파이프에 대한 쓰기는 일부 프로세스가 파이프에서 읽을 때까지 차단됩니다.
crater2150

6
여기에는 명명 된 파이프가 없습니다. /dev/fd/63익명 파이프입니다.
Gilles 'SO- 악의를 멈춰라'

1
@ crater2150, @Gilles / dev / fd / 63은 실제로 명명 된 파이프입니다. 와 같은 것으로 이것을 확인하십시오 file <(ls). 쉘은 익명 파이프를 작성하지만 파일 디스크립터는에 명명 된 파이프로 반영됩니다 /dev/fd. 익명 파이프 인 경우 이름이없고 /dev/fd/63전달 된 명령으로 열 수 없습니다 .
rv

2
@rv 여전히 익명 파이프입니다. 이 익명 파이프를 참조하는 파일 이름이 있다는 것은 이름이 지정된 파이프가 아닙니다. 이름이 지정된 파이프는 다르고 파일 시스템의 어딘가에 있으며 권한과 소유권이 /dev/fd있습니다 . 항목은 모든 파일을 참조 할 수 있습니다. 디스크립터, 익명 파이프 및 소켓, 네트워크 소켓, 공유 메모리 세그먼트 등
Gilles 'SO-stop

1
그래도 왜 63 입니까?
K3 --- rnc

-4

ls명령과 리디렉션을 모두 오해합니다 . ls명령 줄에 제공된 파일과 디렉토리를 나열하지만 stdin의 입력을 허용하지 않습니다. 리디렉션 > >><입력과 수집 출력을 제공하는 파일을 사용하는 방법입니다.


1
여기에는 파일에서 리디렉션이 없습니다. <(…)프로세스 대체입니다.
Gilles 'SO- 악마 그만'

1
Gilles가 말했듯이 @IMSoP는 명명 된 파이프가 아니라 익명의 파이프입니다. 그것은 아주 많이와 동일 x|y하고 거의 동일 [num]<<REDIRECT일부 포탄입니다. 다른 점은 fd 링크의 쉘의 리터럴 대체 /dev/fd/63및 stdin으로 수행하는 것 또는하지 않는 것입니다. 수행 echo | readlink /dev/fd/0과 직접 참조하십시오.
mikeserv

1
@IMSoP- dev링크 인 특수 파일입니다. 대부분의 리눅스 시스템에서 모든 파일 설명자를 사용하여 동일한 작업을 수행 할 수 있습니다 |pipes. 나는 당신이 어디에서 왔는지 알 수 있지만 명명 된 파이프는 그 자체와 별개의 것입니다. 커널 파이프에 대한 파일 시스템 참조입니다. 장치 파일이 아닌 일반 파일 시스템 참조입니다.
mikeserv

1
@mikeserv 흥미롭게도 Bash 매뉴얼/dev/fd/*다른 곳에서 명명 된 파이프를 만들지 않고도 시스템에서 작동 할 것이라고 언급 했다 . 그러나 나는 그 /dev/fd/*자체가 명명 된 파이프와 다른 메커니즘이라는 점을 취합니다 . 덧붙여서, Wikipedia의 설명은 이러한 차이점에 대한 설명과 관련이 있습니다.
IMSoP

1
@mikeserv 내가 찾은 다른 참조에 따르면, 그보다 간단합니다. /dev/fd/*사용할 수 없으면 bash는에서 명명 된 파이프를 만들고 /tmp대신 프로세스 대체에 사용합니다. 나에게 그렇게 이상하게 보이지는 않지만 가능한 한 많은 환경에서 기능을 사용할 수 있습니다.
IMSoP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.