나는 이상한 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 )
또는 ( bash
4.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
readarray
stdin에서 읽는 것도 가능합니다.
readarray arr <<< "$(echo a; echo b; echo c)"; echo ${#arr[@]}