저는 이 특정 예의 맥락에서 명명된 파이프를 이해하려고 노력하고 있습니다.
<(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/63
ls 호출의 출력을 포함하는 파이프에도 마찬가지입니다.
이렇게 하면 전체 줄이 파이프로 대체되어 실제로 실행할 수 없는 명령으로 호출하려고 하기 때문에 오류 <(ls -l)
가 발생합니다 .Permission denied
/dev/fd/63
두 번째 예에서는 cat <(ls -l)
가 됩니다 cat /dev/fd/63
. cat이 인수로 제공된 파일을 읽을 때 내용을 얻게 됩니다. echo
반면에 해당 매개변수를 "있는 그대로" 출력하면 됩니다.
마지막 사례는 <()
명령이 없어서 아무것도 아닌 것으로 대체되었습니다. 그러나 이것은 쉘 간에 일관성이 없습니다. zsh에서는 여전히 파이프가 표시됩니다(비어 있음에도 불구하고).
일반화하다:
<(command)
일반적으로 파일이 필요한 반면 명령의 출력을 사용할 수 있습니다.
편집하다:~처럼자일스이는 명명된 파이프가 아니라 익명 파이프라는 점을 지적하세요. 주요 차이점은 프로세스가 실행되는 동안 존재하는 반면 명명된 파이프(예: 로 생성됨 mkfifo
)는 프로세스가 연결되지 않은 상태에서 변경되지 않고 유지된다는 것입니다.
답변2
ls
명령과 리디렉션을 오해했습니다 . ls
명령줄에 제공된 파일과 디렉터리를 나열하지만 표준 입력의 어떤 입력도 받아들일 수 없다고 생각합니다. 리디렉션 은 파일을 사용하여 입력을 제공하고 출력을 수집하는 방법 >
>>
입니다 .<