나는 이상한 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 )
또는 bash
4.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[@]}