나는 bash와 꽤 편안하지만 최근에 나는 알지 못하는 대용으로 끝났다.
<(<command>)
bash에는 정확히 무엇입니까 ? =(<command>)
zsh와 어떻게 비교 됩니까?
나는 이것이 기본 파일 설명자와 관련이 있음을 이해합니다. 내 컴퓨터에서
echo <()
returns /proc/self/fd/11
, 스크립트 STDOUT의 사본으로 밝혀졌지만 여전히 혼란 스럽습니다.
나는 bash와 꽤 편안하지만 최근에 나는 알지 못하는 대용으로 끝났다.
<(<command>)
bash에는 정확히 무엇입니까 ? =(<command>)
zsh와 어떻게 비교 됩니까?
나는 이것이 기본 파일 설명자와 관련이 있음을 이해합니다. 내 컴퓨터에서
echo <()
returns /proc/self/fd/11
, 스크립트 STDOUT의 사본으로 밝혀졌지만 여전히 혼란 스럽습니다.
답변:
이것을 프로세스 대체라고합니다.
이 <(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 참조 ) 프로그램이 작동하지 않습니다.
이것은 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)는 <()
프로세스 대체 구문 의 시작입니다 .
pfctl -f <(echo "pf rules")
가 나쁜 파일 디스크립터를 말할 수 있는지 알아내는 데 도움이되었습니다 . 대신 zsh 및 = (echo "pf rules")를 사용하십시오.