read
bash 내장 기능은 stdin의 입력을 받아들인다고 하는데, 다음 명령은 왜 아무 것도 읽지 못하는 걸까요?
$ printf "%s" "a b" | read line
$ printf "%s" "$line"
$
감사해요.
답변1
문제는 read
그 자체가 아니라 파이프라인입니다. Bash에서는 두 번째 명령( read
이 경우)이 하위 쉘에서 실행됩니다. 따라서 실제로는 변수로 들어가고 read
해당 line
변수만 서브쉘에 존재하며 파이프가 완료되면 사라집니다.
(다른 셸은 다르게 동작합니다. 특히 ksh는 현재 셸에서 파이프라인의 마지막 명령을 실행하므로 이 코드 조각은 ksh에서 작동할 수 있습니다. 하지만 보시다시피 bash에서는 작동하지 않습니다.)
<(...)
가능한 해결책 중 하나는 파이프의 첫 번째 부분에 프로세스 대체를 사용하고 추가로 <
표준 입력으로 리디렉션하는 것입니다.
read line < <(printf "%s" "a b")
이 특별한 경우에는 명령 없이 수행할 수 printf
있으며 <<<
작동합니다.
read line <<<"a b"