다음 상황을 고려해보세요.
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 셸에서는 <(...)
다른 함수의 구문입니다.프로세스 리디렉션.
그 말투구문 오류: 예상치 못한 리디렉션오류는 귀하의 쉘이 Almquist 쉘의 파생물임을 나타냅니다 dash
. 예를 들어 제가 아는 한 둘 다 아닙니다.프로세스 교체...도 아니다프로세스 리디렉션모든 파생 상품에 추가되었습니다 ash
.
while ...; done <(cmd)
에서 작동 yash
하고 while ...; done < <(cmd)
AT&T ksh, zsh 및 bash에서 작동하지만 표준 sh
구문도 아니고 에서도 작동하지 않습니다 dash
.
dash
(또는 모든 구현) 에는 가 sh
필요 cmd | while ...; done
하지만 에서는 dash
while 루프가 하위 쉘에서 실행됩니다.
다음을 수행할 수 있습니다.
while ...; done << EOF
$(cmd)
EOF
cmd
그러나 전체 출력 (최소한 모든 NUL 문자 및 모든 후행 줄 바꿈 제외)을 메모리에 저장하고 dash
추가 줄 바꿈을 다시 추가합니다.
어떤 경우 에라도,루프를 사용하는 것은 while read
일반적으로 잘못된 접근 방식을 취하고 있음을 나타냅니다., 특히 텍스트 처리만을 위한 경우에는 더욱 그렇습니다.