내가 이해하는 한 bash 문서는 | 및 < 표준 입력을 리디렉션합니다. 그러므로 cmd | foo
and는 foo < <(cmd)
어느 정도 동일해야 합니다. 그러나 bash-internal read 명령의 경우에는 그렇지 않은 것 같습니다. 예를 들어 내가 입력하면
a=""; b=""; read a b < <(echo a b); echo $a $b
a b
동시에 출력됩니다
a=""; b=""; echo a b | read a b; echo $a $b
아무것도 인쇄되지 않습니다. 반면에 내가 입력하면
a=""; b=""; cat < <(echo a b) >foo1
a=""; b=""; echo a b | cat > foo2
파일 foo1과 foo2는 동일합니다. 그래서 내 질문은: 명령을 읽을 때(또는 일반적으로) 두 형식의 차이점은 무엇입니까? 정확히 동일한 리디렉션 입력이 표시되어야 합니다. 양식이 작동하는 동안 < <(...)
읽기가 매우 어려우며 파이프 양식을 사용하는 것을 선호합니다.
답변1
파이프 작업은 read
서브셸에서 수행되지만 프로세스 대체는 수행되지 않습니다. 대부분의 사용 사례에서는 이것이 문제가 되지 않지만 이 경우 변수를 조작하여 셸에 직접 영향을 미치기를 원합니다. read
서브쉘에서 호출되기 때문에 서브쉘만 영향을 받습니다. 따라서 수행하려는 모든 작업은 하위 셸에서도 수행되어야 합니다. 예를 들면 다음과 같습니다.
echo a b | { read a b ; echo "$a" "$b" ; }