다양한 루프에서 동일한 배열에 추가하고 마지막 값만 유지 Bash 4

다양한 루프에서 동일한 배열에 추가하고 마지막 값만 유지 Bash 4

나는 다음과 같은 것을 가지고 있습니다 :

FILES=()
for i in *.map
do
    FILES+=($i)
done

find /var/candy -name "chocolate_[0-9]" | while read snack
do
    FILES+=($snack)
done

for file in ../out/amsterdam/apples/{system.map,vmlinux}
do
    FILES+=($file)
done

그러나 배열에는 ../out/amsterdam/apples/system.map합계 만 포함됩니다 ../out/amsterdam/apples/vmlinux. 다른 값은 어떻게 되나요? 변수에 무언가가 포함되어 있는지 확인하기 위해 에코하기 때문에 이러한 루프에 존재한다는 것을 알고 있습니다.

답변1

에서 가져옴배쉬 FAQ:

파이프라인 내의 루프에 변수를 설정했습니다. 루프가 끝나면 왜 사라지나요?

위에서 언급한 것처럼 잠재적으로 놀라운 동작이 발생하는 이유는 각 SubShell이 ​​새로운 변수 컨텍스트와 환경을 도입하기 때문입니다. 위의 while 루프는 부모 셸에서 얻은 초기 값 "0"으로 생성된 linecount 변수의 자체 복사본을 갖는 새 하위 셸에서 실행됩니다. 이 사본은 계산에 사용됩니다. while 루프가 완료되면 하위 셸 복사본이 삭제되고 상위 셸의 원래 변수 linecount(해당 값은 변경되지 않음)가 echo 명령에 사용됩니다.

두 번째 루프에서 서브셸이 생성되는 것을 방지하려면 파이프가 아닌 다른 것을 통해 데이터를 공급할 수 있습니다.

while read snack; do
    FILES+=($snack)
done < <(find /var/candy -name "chocolate_[0-9]")

.

while read snack; do
    FILES+=($snack)
done <<<"$(find /var/candy -name "chocolate_[0-9]")"

관련 정보