readarray (또는 파이프) 문제 array 그러나이 스크립트는 작동하지 않습니다 (배열이

나는 이상한 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[@]}

파이프에 어떤 문제가 있습니까?



답변

어쩌면 시도하십시오 :

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

나는 그것이 효과가있을 것으로 기대하지만 파이프 라인 의 끝에서 마지막 {; }컨텍스트에서 벗어나 |면 변수 값을 잃게됩니다. 파이프 라인 내의 |개별 |프로세스가 각각 서브 쉘 |에서 실행 되기 때문 입니다. 따라서 같은 이유로 작동하지 않습니다.()

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

…하지 않습니다-변수 값은 호출 한 것과 다른 쉘 프로세스 에서 설정되었습니다 .


답변

readarray현재 쉘에서 명령이 실행 되도록하려면 파이프 라인 대신 프로세스 대체를 사용하십시오.

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

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

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

답변

readarray stdin에서 읽을 수도 있습니다.

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