bash에서 <()가 정확히 무엇입니까 (zsh에서 = ())?


36

나는 bash와 꽤 편안하지만 최근에 나는 알지 못하는 대용으로 끝났다.

<(<command>)bash에는 정확히 무엇입니까 ? =(<command>)zsh와 어떻게 비교 됩니까?

나는 이것이 기본 파일 설명자와 관련이 있음을 이해합니다. 내 컴퓨터에서

echo <()

returns /proc/self/fd/11, 스크립트 STDOUT의 사본으로 밝혀졌지만 여전히 혼란 스럽습니다.

답변:


51

이것을 프로세스 대체라고합니다.

<(list)구문은 bash및에서 모두 지원됩니다 zsh. list파이프 ( |)를 사용할 수없는 경우 명령 ( ) 의 출력 을 다른 명령 으로 전달하는 방법을 제공 합니다. 예를 들어 명령이 입력을 지원하지 않거나 STDIN여러 명령의 출력이 필요한 경우 :

diff <(ls dirA) <(ls dirB)

<(list)시스템에서 지원하는 경우 list파일 의 출력을 파일에 연결합니다 /dev/fd. 그렇지 않으면 명명 된 파이프 (FIFO)가 사용됩니다 (시스템의 지원에 따라 다름). 오류). 그런 다음 파일 이름이 명령 행에서 인수로 전달됩니다.


zsh=(list)대한 가능한 교체를 추가로 지원합니다 <(list). 으로 =(list)임시 파일 대신에 파일의 사용 /dev/fd또는 FIFO. <(list)프로그램이 출력에서 ​​잃어 버려야하는 경우에 대한 대체물로 사용될 수 있습니다 .

ZSH 매뉴얼 에 따르면 <(list)작동 방식 과 관련된 다른 문제가있을 수도 있습니다 .

=형식은 /dev/fd명명 된 파이프 구현과 <(...)단점이 있기 때문에 유용합니다 . 전자의 경우, 특히 프로그램이 setuid를 실행할 때와 같은 보안상의 이유로 이것이 필요한 경우, 일부 프로그램은 명령 행에서 파일을 검사하기 전에 해당 파일 디스크립터를 자동으로 닫을 수 있습니다. 두 번째 경우, 프로그램이 실제로 파일을 열지 않으면 파이프에서 읽거나 쓰려고 시도하는 서브 쉘은 (일반적인 구현에서는 다른 운영 체제가 다른 동작을 가질 수 있음) 블록을 영원히 없애고 명시 적으로 종료해야합니다. . 두 경우 모두, 쉘은 실제로 파이프를 사용하여 정보를 제공하므로 lseek(2)파일 에서 lseek (man page 참조 ) 프로그램이 작동하지 않습니다.


이것은 왜 MacOS pfctl -f <(echo "pf rules")가 나쁜 파일 디스크립터를 말할 수 있는지 알아내는 데 도움이되었습니다 . 대신 zsh 및 = (echo "pf rules")를 사용하십시오.
johnnyB

9

이것은 zsh가 아닌 bash 답변입니다.

bash에는 파이프를 사용할 수없는 경우가 있습니다.

some_command | some_other_command

파이프는 파이프 라인의 각 구성 요소에 대해 서브 쉘을 도입하기 때문에 서브 쉘이 종료되면 의존했던 부작용이 사라집니다. 예를 들어,이 예는 다음과 같습니다.

cat file | while read line; do ((count++)); done
echo $count

$count변수가 현재 쉘에 없기 때문에 빈 줄이 표시됩니다 .

bash 프로세스 대체를 사용하면 파일에서와 같이 "some_command"출력에서 읽을 수있게하여이 수수께끼를 피할 수 있습니다.

while read line; do ((count++)); done < <(cat file)
# ....................................1.2
echo $count   # the variable *does* exist in the current shell

(1)은 일반적인 입력 리디렉션입니다. (2)는 <()프로세스 대체 구문 의 시작입니다 .


2
zsh의 = (cmdlist)는 bash의 <(cmdlist)와 거의 동일한 효과를 갖지만 리디렉션을 위해 cmdlist의 출력으로 임시 파일을 작성 (준비되면 삭제)합니다. 프로그램에서 탐색을 수행 할 때 유용합니다. <(cmdlist)는 zsh에도 알려져 있습니다.
곰 바이 산도르
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.