이 코드의 내보내기가 어떤 작업을 수행합니까?

이 코드의 내보내기가 어떤 작업을 수행합니까?

존재하다TLDP 스크립트 웹 페이지 분석, 분석을 위해 다음 코드를 제공합니다.

export SUM=0
for f in $(find src -name "*.java"); do
    export SUM=$(($SUM + $(wc -l $f | awk '{ print $1 }')))
done
echo $SUM

내가 이해한 바로는 디렉토리에 있는 모든 *.java 파일의 줄 수 합계를 계산합니다 src. 내가 이해하지 못하는 것은 키워드를 사용하는 이유입니다 export.그렇게 설명했다:

내보내기 명령은 실행 중인 스크립트 또는 셸의 모든 하위 프로세스에서 변수를 사용할 수 있도록 합니다.

자식 프로세스는 절대 접근하지 않을 것이기 때문에 SUM내보내는 이유는 무엇입니까?

답변1

내가 이해한 바에 따르면 src 디렉토리에 있는 모든 *.java 파일의 행 합계를 계산합니다.

이것은 반드시 전적으로 사실은 아닙니다. *.java디렉토리 트리에 루트가 있는 모든 파일 src(즉 , 모든 하위 디렉토리) src의 줄 수 합계를 계산합니다 . 그러나 공백을 포함하고 .java.

SUM은 하위 프로세스에서 액세스할 수 없으므로 내보낼 이유가 있습니까?

아니요.

이 프로세스 중에 파일 이름을 안전하게 만들기 위해 다음과 같은 코드 조각을 작성할 수 있습니다.

find src -type f -name '*.java' -exec wc -l {} \; | awk '{ s += $1 } END { print s }'

더 나은 해결책은 다음과 같습니다.

find src -type f -name '*.java' -exec cat {} + | wc -l

답변2

맞습니다. 여기서는 사용할 필요가 없습니다 export. 하지만 이 코드에는 더 많은 문제가 있습니다.

$  ~/.cabal/bin/shellcheck e.sh

In e.sh line 4:
for f in $(find src -name "*.java"); do
         ^------------------------^ SC2044: For loops over find output are fragile. Use find -exec or a while read loop.


In e.sh line 5:
    export SUM=$(($SUM + $(wc -l $f | awk '{ print $1 }')))
                  ^--^ SC2004: $/${} is unnecessary on arithmetic variables.
                                 ^-- SC2086: Double quote to prevent globbing and word splitting.

Did you mean:
    export SUM=$(($SUM + $(wc -l "$f" | awk '{ print $1 }')))

For more information:
  https://www.shellcheck.net/wiki/SC2044 -- For loops over find output are fr...
  https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
  https://www.shellcheck.net/wiki/SC2004 -- $/${} is unnecessary on arithmeti...

스크립트에서는 소문자 변수 이름을 사용하는 것이 좋습니다. 이것 설명을 위해.

일반적으로 tldp.org는 권장되지 않습니다. 이것또는 이것. 나는 또한 StackExchange에서 tldp.org를 더 이상 사용하지 않는 사람들을 보았습니다.

관련 정보