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

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

다음 시나리오를 고려하십시오.

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)에서는 작동하고 yashAT while ...; done < <(cmd)&T ksh, zsh 및 bash에서는 작동하지만 둘 다 표준 sh구문도 아니고 에서도 작동하지 않습니다 dash.

dash(또는 모든 sh구현) 에는 가 필요 cmd | while ...; done하지만 에서는 dashwhile 루프가 하위 쉘에서 실행된다는 점에 유의하세요.

당신은 할 수 있습니다 :

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

cmd(적어도 모든 NUL 문자와 모든 후행 개행 문자를 제거한 ) 전체 출력을 dash메모리에 저장하고 하나의 추가 개행 문자를 다시 추가한다는 점에 주의하세요.

어쨌든,루프 를 사용하는 while read것은 종종 잘못된 접근 방식을 취하고 있다는 표시입니다., 특히 텍스트 처리만을 위한 경우에는 더욱 그렇습니다.

관련 정보