하위 쉘에서 상위 쉘로 변수를 인쇄합니다.

하위 쉘에서 상위 쉘로 변수를 인쇄합니다.

Bash를 처음 접했고 로컬/전역 변수/하위 쉘에 대해 꽤 혼란스럽습니다. 왜 수정된 변수가 함수 끝에서 인쇄되지 않는지 잘 모르겠습니다. 파일 끝에서 최종 줄 수와 파일 수를 인쇄하려고 하는데 그렇게 하면 인쇄만 됩니다. 지역 변수이기 때문에 0이 됩니다. 수정된 값을 인쇄할 수 있는 방법이 있나요?

count=0
files=0
find . -type f | while IFC= read -r file;
do
   let files=files+1
   wc -l $file
   count=$(($count+$(wc -l < $file)))
   echo "total lines $count ; total files $files"
done
echo $files $count
exit 0

답변1

예. 그러나 그것은 전혀 직관적이지 않습니다. 예를 들어 다음과 같이 작동합니다.

#!/bin/bash
count=0
files=0
while IFS= read -r file;
do
   let files=files+1
   wc -l $file
   count=$(($count+$(wc -l < $file)))
   echo "total lines $count ; total files $files"
done < <(find . -type f )
echo "$files $count"
exit 0

구조물이 <(command)호출됩니다."프로세스 대체"명령의 출력을 "파일"로 처리할 수 있습니다. 이런 식으로 루프에 입력하면 스크립트가 예상대로 작동하게 됩니다.

문제는 파이프( |)를 사용하여 while 루프가 외부 변수를 수정할 수 없는 별도의 하위 쉘에서 실행된다는 것입니다.

이 기능을 지원하지 않는 셸에서는 <()하위 판매의 파이프 오른쪽에 있는 명령을 실행하고 해당 하위 셸에 최종 에코를 포함할 수 있습니다.

#!/bin/bash
files=0
find . -type f | {
    while IFC= read -r file;
    do
        let files=files+1
        wc -l $file
        count=$(($count+$(wc -l < $file)))
        echo "total lines $count ; total files $files"
    done
    echo "$files $count"
}

exit 0

관련 정보