![표준 입력에서 "읽기"를 읽으려면 어떻게 해야 합니까? [복사]](https://linux55.com/image/145473/%ED%91%9C%EC%A4%80%20%EC%9E%85%EB%A0%A5%EC%97%90%EC%84%9C%20%22%EC%9D%BD%EA%B8%B0%22%EB%A5%BC%20%EC%9D%BD%EC%9C%BC%EB%A0%A4%EB%A9%B4%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
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"