Bash 읽기 명령 및 stdin 리디렉션

Bash 읽기 명령 및 stdin 리디렉션

내가 이해하는 한 bash 문서는 | 및 < 표준 입력을 리디렉션합니다. 그러므로 cmd | fooand는 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" ; }

관련 정보