file1
stdin으로 리디렉션하면 sh의 읽기 명령이 작동합니다.
$ cat file1
first second
$ read u v <file1
$ echo $u
first
$ echo $v
second
그러나 echo와 같이 stdout을 리디렉션하면
$ echo first second | read a b
$ echo $a
이것은 작동하지 않습니다. 두 번째 경우에는 read가 파이프에서 표준 입력을 얻는다고 생각합니다. 내가 왜 틀렸나요? 감사해요.
답변1
첫 번째 예에서는 다음과 같습니다.
read
및 "echo"는 명령을 입력하는 대화형 셸(동일한 프로세스)에 의해 실행되는 셸 내장 명령이므로 이러한 명령의 결과는 실행 중인 셸 환경에 따라 달라집니다.
따라서 명령에서 복귀할 때 read
u 및 v 변수 값에 대한 완전한 지식을 가지고 여전히 동일한 셸에 있습니다.
두 번째 예에서는:
명령이 내장되어 있더라도 파이핑은 대화형 셸이 하위 프로세스를 포크하도록 강제합니다. 이 경우 상위 환경에 영향을 주지 않고 읽기 명령을 실행하고 자체 환경을 업데이트(u 및 v 변수에 값 할당)하는 하위 쉘을 트리거합니다.
따라서 읽기가 완료되면 서브쉘이 종료되고 대화형 쉘로 돌아가게 되는데, 이는 서브쉘에서 설정한 u 및 v 변수 값을 전혀 인식하지 못하는 상태입니다.