프로세스 교체로 인해 파이프인 /dev/fd/63이라는 파일이 생성되는 이유는 무엇입니까?

프로세스 교체로 인해 파이프인 /dev/fd/63이라는 파일이 생성되는 이유는 무엇입니까?

저는 이 특정 예의 맥락에서 명명된 파이프를 이해하려고 노력하고 있습니다.

<(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 <()디렉토리 내용이 나열됩니다.

명명된 파이프를 사용하면 어떻게 되나요?

답변1

이렇게 하면 <(some_command)쉘은 대괄호 안의 명령을 실행하고 전체 내용을 명령의 표준 출력에 연결된 파일 설명자로 바꿉니다. /dev/fd/63ls 호출의 출력을 포함하는 파이프에도 마찬가지입니다.

이렇게 하면 전체 줄이 파이프로 대체되어 실제로 실행할 수 없는 명령으로 호출하려고 하기 때문에 오류 <(ls -l)가 발생합니다 .Permission denied/dev/fd/63

두 번째 예에서는 cat <(ls -l)가 됩니다 cat /dev/fd/63. cat이 인수로 제공된 파일을 읽을 때 내용을 얻게 됩니다. echo반면에 해당 매개변수를 "있는 그대로" 출력하면 됩니다.

마지막 사례는 <()명령이 없어서 아무것도 아닌 것으로 대체되었습니다. 그러나 이것은 쉘 간에 일관성이 없습니다. zsh에서는 여전히 파이프가 표시됩니다(비어 있음에도 불구하고).

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

편집하다:~처럼자일스이는 명명된 파이프가 아니라 익명 파이프라는 점을 지적하세요. 주요 차이점은 프로세스가 실행되는 동안 존재하는 반면 명명된 파이프(예: 로 생성됨 mkfifo)는 프로세스가 연결되지 않은 상태에서 변경되지 않고 유지된다는 것입니다.

답변2

ls명령과 리디렉션을 오해했습니다 . ls명령줄에 제공된 파일과 디렉터리를 나열하지만 표준 입력의 어떤 입력도 받아들일 수 없다고 생각합니다. 리디렉션 은 파일을 사용하여 입력을 제공하고 출력을 수집하는 방법 > >>입니다 .<

관련 정보