readarray(또는 파이프) 문제

readarray(또는 파이프) 문제

나는 이상한 readarray명령을 계속했습니다.

우리를 man bash:

readarray
     Read lines from the standard input into the indexed array variable array

그러나 다음 스크립트는 작동하지 않습니다(배열이 비어 있음).

unset arr; (echo a; echo b; echo c) | readarray arr; echo ${#arr[@]}
unset arr; cat /etc/passwd | readarray arr;  echo ${#arr[@]}

이러한 작업은 다음과 같습니다.

unset arr; readarray arr < /etc/passwd ;  echo ${#arr[@]}
unset arr; mkfifo /tmp/fifo; (echo a; echo b; echo c) > /tmp/fifo & mapfile arr < /tmp/fifo ; echo ${#arr[@]}

수도관에 무슨 문제가 있나요?

답변1

현재 셸에서 명령이 실행 되도록 하려면 readarray파이프 대신 프로세스 대체를 사용하세요.

readarray -t arr < <( echo a; echo b; echo c )

또는 ( bash4.2 이상인 경우) lastpipe쉘 옵션을 사용하십시오:

shopt -s lastpipe
( echo a; echo b; echo c ) | readarray -t arr

두 번째 방법은 lastpipe기본적으로 대화형 세션에서는 작동하지 않습니다. 이 경우 먼저 실행해 보세요.

set +m

"모니터 모드"를 비활성화합니다.

답변2

어쩌면 시도해 보세요:

unset arr
printf %s\\n a b c | {
    readarray arr
    echo ${#arr[@]}
}

{작동할 것으로 예상했지만 파이프 끝의 마지막 쉘 컨텍스트에서 나가면 변수 값이 손실됩니다. 이는 파이프라인의 각 개별 프로세스가 하위 셸에서 실행되기 때문입니다. 따라서 귀하의 제품은 같은 이유로 작동하지 않습니다.; }||||()

( arr=( a b c ) ) ; echo ${arr[@]}

...no - 변수 값이 설정됩니다.다른호출한 프로세스 대신 쉘 프로세스를 사용합니다.

답변3

readarraystdin에서 읽는 것도 가능합니다.

readarray arr <<< "$(echo a; echo b; echo c)"; echo ${#arr[@]}

관련 정보