-d 옵션과 함께 zip 명령을 사용할 때 "zip 경고: 이름이 일치하지 않음"을 무시하려면 어떻게 해야 합니까?

-d 옵션과 함께 zip 명령을 사용할 때 "zip 경고: 이름이 일치하지 않음"을 무시하려면 어떻게 해야 합니까?

백그라운드에서 여러 명령을 실행하기 위해 sh 파일을 만들고 있습니다.

이 파일의 일부 줄에는 다음과 같은 zip 파일을 업데이트하는 명령이 있습니다.

zip -d archive.zip file.txt

이 file.txt는 항상 archive.zip의 일부가 아닐 수도 있습니다. 그렇지 않은 경우 쉘 스크립트는 다음과 같이 해당 줄에서 중단됩니다.

zip warning: name not matched

이 파일이 존재하지 않는 것을 무시하고 다음 줄을 계속 진행하고 싶습니다. 이 작업을 어떻게 수행할 수 있나요?

답변1

일반적으로 쉘 스크립트에서는 오류를 생성하는 행이라도 쉘 스크립트 실행을 중지하지 않습니다. 그냥 다음 줄로 넘어갈 겁니다.

주목할만한 예외는 하위 명령이 실패할 경우 쉘을 종료하도록 플래그를 설정한 경우입니다. 이는 때때로 스크립트 상단 근처에 "set -e"를 추가하여 수행됩니다. 스크립트에 이와 같은 것이 있으면 오류를 반환하는 스크립트의 모든 명령이 중단됩니다. 이 경우 옵션은 다음과 같습니다.

  • 해당 옵션을 제거하세요. 이는 스크립트의 나머지 부분에 영향을 미칠 수 있으므로 변덕스럽게 이 작업을 수행하지 마십시오.

  • 현재 있는 스크립트 섹션에 대한 옵션을 껐다가 다시 켜서 계속하세요.

    set +e
    zip -d archive.zip file.txt
    set -e
    
  • 실패한 행에 대한 탈출구를 제공하여 무언가 실패하더라도 쉘이 명령을 성공으로 간주하도록 합니다. 여러 가지 방법으로 이를 수행할 수 있지만 가장 간단한 방법 중 하나는 OR 연산자를 사용하는 것입니다.

    zip -d archive.zip file.txt || true
    

    이것은 zip 명령을 실행하지만, 실패하면 true 명령을 실행하고 상위 쉘은 그로부터 반환 코드를 얻습니다(물론 성공입니다). ||:약간 더 빠르고 까다롭지만 마법은 아닌 이 내용이 때때로 작성되는 것을 볼 수 있습니다 . :아무 작업도 수행하지 않더라도 성공 오류 코드를 반환하는 쉘 내장 no-op 명령일 뿐입니다.

    이를 수행하는 또 다른 방법은 하위 쉘에서 명령을 둘러싸서 실행하는 것입니다. ()그러면 내부 명령이 실패하더라도 하위 쉘이 작업을 수행하므로 set -eset이 있는 상위 스크립트가 죽지 않습니다. 이는 단일 명령에 대해서는 차선책이지만 전체 작업 세트를 실행하려는 경우 유용할 수 있습니다.

반면에 zip으로 생성된 오류 메시지만 표시하지 않으려면 ( 2> /dev/null)를 사용하여 표준 오류 스트림을 /dev/null로 리디렉션하여 생성된 메시지를 표시하지 않도록 할 수 있습니다(또는 를 사용하여 닫을 수 있습니다 2>&-).

관련 정보