다음 시나리오를 고려하십시오.
diff file.txt <( cat file.txt | grep -v '^\s*#'| sed '/^$/d' )
이는 파일을 처리하고 그 결과를 입력으로 로 리디렉션하는 오른쪽에서 왼쪽으로 리디렉션의 예입니다 diff
. 유사한 사용 사례가 제안되었습니다.여기, 그것도 잘 작동합니다.
그러나 비슷한 방식으로 파일 처리 결과를 코드 블록으로 리디렉션하려는 시도는 실패합니다.
while read I; do
…
done <( cat $FIL | <do_something_here> )
Syntax error: "(" unexpected
또는 다음을 시도해 보세요.
done < <( cat $FIL | <do_something_here> )
Syntax error: redirection unexpected
일부 프로세스의 출력을 입력으로 코드 블록으로 어떻게 리디렉션합니까?
답변1
<(...)
프로세스 대체Korn 쉘의 기능입니다. zsh와 bash에서도 사용할 수 있습니다. rc
및 파생물도 있으며 fish
프로세스 대체 지원도 있지만 구문은 다르지만 yash 셸에는 <(...)
다른 기능에 대한 구문이 있습니다.프로세스 리디렉션.
그 말투는구문 오류: 예상치 못한 리디렉션오류는 귀하의 쉘이 dash
. AFAIK도 아니고프로세스 대체...도 아니다프로세스 리디렉션모든 파생 상품에 추가되었습니다 ash
.
while ...; done <(cmd)
에서는 작동하고 yash
AT while ...; done < <(cmd)
&T ksh, zsh 및 bash에서는 작동하지만 둘 다 표준 sh
구문도 아니고 에서도 작동하지 않습니다 dash
.
dash
(또는 모든 sh
구현) 에는 가 필요 cmd | while ...; done
하지만 에서는 dash
while 루프가 하위 쉘에서 실행된다는 점에 유의하세요.
당신은 할 수 있습니다 :
while ...; done << EOF
$(cmd)
EOF
cmd
(적어도 모든 NUL 문자와 모든 후행 개행 문자를 제거한 ) 전체 출력을 dash
메모리에 저장하고 하나의 추가 개행 문자를 다시 추가한다는 점에 주의하세요.
어쨌든,루프 를 사용하는 while read
것은 종종 잘못된 접근 방식을 취하고 있다는 표시입니다., 특히 텍스트 처리만을 위한 경우에는 더욱 그렇습니다.