2017-12-07 9 views
1

아래 코드의 두 번째 줄에 ShellCheck 경고 [SC2045]가 표시됩니다. 마지막으로 ls을 시도하기 전에 디렉터리가 비어 있지 않은지 확인하는대로 무시해도됩니까?ShellCheck 경고 : "ls 출력 반복 반복이 쉽지 않습니다. [SC2045]"

if [ "$(ls -A "$retryDir")" ] ; then 
    for thisRetryFile in $(ls "$retryDir"/*.tar.gz) ; do 
     scp -o ConnectTimeout=30 "$thisRetryFile" \    
       "[email protected]$remoteHost:$remotePath" >> "$BACKUPLOG" 
    done 
fi 

UPDATE : 후 주석을 읽은 후. 회선을 다음으로 변경했습니다 :

for thisRetryFile in "$retryDir"/*.tar.gz ; do 

경고를 삭제했습니다.

+1

보기 [BashPitfall # 1 (http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29). – randomir

+0

빈 디렉토리 만 문제는 아닙니다. 공백이있는 파일 이름도 문제가됩니다. – Barmar

+2

[이유는 무엇입니까?] (https://unix.stackexchange.com/questions/128985/why-not-parse-ls) – Barmar

답변

1

glob가있는 루프를 사용하고 nullglob을 설정하여 패턴이 다른 것과 일치하지 않을 경우 scp이 실행되지 않도록하십시오. nullglobfor 이후 그리고 당신도 외부 if 조건이 필요하지 않습니다, 효과적으로 그 처리한다 : 당신은 어떤 파일이 당신이 쓸 수있는 패턴, 일치하지 않는 경우를 잡을하려면

shopt -s nullglob 

for thisRetryFile in "$retryDir"/*.tar.gz; do 
    scp -o ConnectTimeout=30 "$thisRetryFile" \ 
      "[email protected]$remoteHost:$remotePath" >> "$BACKUPLOG" 
done 

이와 같은, shopt -s nullglob를 사용하지 않고 :

for thisRetryFile in "$retryDir"/*.tar.gz; do 
    if [ -f "$thisRetryFile" ]; then 
     scp -o ConnectTimeout=30 "$thisRetryFile" \ 
      "[email protected]$remoteHost:$remotePath" >> "$BACKUPLOG" 
     break 
    else 
     echo "warn: no tar.gz file in dir: $retryDir" 
    fi 
done 
+0

그건 정말 의견의 문제입니다. 정말로 안전한 대안은 와일드 카드를 사용하는 모든 위치에서 성냥이없는 경우를 처리하는 것입니다. 그렇다면 널 글로브 (nullglob) 또는 다른 것을 사용할 지 여부는 상황에 따라 다릅니다. 당신의 주장이 사라질 때 어떤 것들은 더 어려워집니다. – tripleee

+0

@ tripleee fair point, 나는 그걸 처리 할 수있는 대안을 추가했다. – janos

+0

@AndyM 예, 그렇게 – janos

-1

보다 안전합니다. 시도 해봐.

if [ "$(ls -A "$retryDir")" ] ; then 
    for thisRetryFile in ${retryDir}'/*.tar.gz' ; do 
     scp -o ConnectTimeout=30 "$thisRetryFile" "[email protected]$remoteHost:$remotePath" >> "$BACKUPLOG" 
    done 
fi 

감사합니다.

+1

아니요, 여전히 [스크립트에서'ls를 사용하지 마십시오] (https://unix.stackexchange.com/questions/128985/why-not-parse-ls)를 위반합니다. – tripleee

+2

인용 된 와일드 카드는 단순히 잘못되었습니다. – tripleee