표준 입력에서 "읽기"를 읽으려면 어떻게 해야 합니까? [복사]

표준 입력에서 "읽기"를 읽으려면 어떻게 해야 합니까? [복사]

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"

관련 정보