오른쪽에서 왼쪽으로 코드 블록으로 리디렉션

오른쪽에서 왼쪽으로 코드 블록으로 리디렉션

다음 상황을 고려해보세요.

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하지만 에서는 dashwhile 루프가 하위 쉘에서 실행됩니다.

다음을 수행할 수 있습니다.

while ...; done << EOF
$(cmd)
EOF

cmd그러나 전체 출력 (최소한 모든 NUL 문자 및 모든 후행 줄 바꿈 제외)을 메모리에 저장하고 dash추가 줄 바꿈을 다시 추가합니다.

어떤 경우 에라도,루프를 사용하는 것은 while read일반적으로 잘못된 접근 방식을 취하고 있음을 나타냅니다., 특히 텍스트 처리만을 위한 경우에는 더욱 그렇습니다.

관련 정보