쉘 스크립트 오류 처리

쉘 스크립트 오류 처리

저는 특정 폴더의 파일(이 경우 해당 폴더의 모든 .csv 파일)을 삭제하는 매우 간단한 셸을 작성하고 있습니다.

코드는 다음과 같습니다.

#!/bin/bash
# Used to clean folder

MinVal=0
Files=$(ls -1 *.csv | wc -l)


if [ $Files -gt $MinVal ];then
        rm *.csv
        echo -e "\e[31;43m***** DONE *****\e[0m"    

 else       
        echo -e "\e[31;43mThere is no valid file to delete, please check\e[0m"      


fi

셸 스크립트는 예상대로 작동하지만 셸을 실행하고 폴더에 .csv 파일이 없으면 터미널에 다음이 표시됩니다.

ls: cannot access *.csv: No such file or directory

물론 다음 else메시지도 표시됩니다.

There is no valid file to delete, please check

이를 피하고 오류 처리를 ls: cannot access *.csv: No such file or directory직접 수행할 수 있는 방법이 있습니까 ?else

인사.

답변1

이는 쉘이 *.csv기본 POSIX 동작인 그대로 전달하기 때문에 발생합니다. ls이를 방지하려면 nullglob입력 축어 문자열을 반환하는 대신 아무것도 반환하지 않는 glob을 사용해야 합니다. 하지만 여기에는 문제가 있습니다. ls파일이 제공되지 않으면 동작이 다르기 때문입니다.

파일 이름에 개행 문자가 포함된 경우 오류를 방지할 수 있는 이점이 있는 다음 방법을 시도해 보십시오.

shopt -s nullglob
filenames=( *.csv )  # put all files in an array
files="${#filenames[@]}"  # get number of files

답변2

경고 메시지를 표시하지 않으려면 ls가장 간단한 방법은 로 리디렉션하는 것입니다 stderr. /dev/null예를 들면 다음과 같습니다.

Files=$(2>/dev/null ls -1 *.csv | wc -l)

리디렉션은 stderr억제됩니다.모두*.csv디렉터리의 누락된 파일과 관련이 없을 수 있는 오류를 포함하여 이 명령으로 인해 발생한 오류입니다.

파일 수를 계산하는 더 나은 솔루션은 다음과 같이 find대신 사용하는 것입니다 ls.

find . -maxdepth 1 -name "*.csv" | wc -l

실제로 다음을 사용하여 삭제를 수행할 수도 있습니다 find.

find . -maxdepth 1 -name "*.csv" -delete

나는 또한 당신이 -r플래그를 사용했다는 것을 알아차렸습니다. 이는 당신이 를 사용하여 단순 검색을 한 다음 를 사용하여 재귀 삭제를 rm수행했기 때문에 의도하지 않은 것처럼 보입니다 .lsrm

하지만 솔직히 이 작업을 스크립트로 작성하는 것이 타당하지 않다고 생각합니다. 명령을 직접 실행하는 것과 비교하여 이 스크립트의 이점은 무엇입니까? 즉, 이것이 무엇이 문제인지:

# Check for files
ls *.csv

# Delete the files
rm *.csv

이러한 명령을 실행하는 것보다 스크립트를 실행하는 것이 더 나은 이유는 무엇입니까? 오버헤드를 추가하고 하나의 오류 메시지를 다른 오류 메시지로 바꾸는 것 같습니다.

관련 정보