백그라운드에서 여러 명령을 실행하기 위해 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 명령을 실행하지만 실패할 경우 상위 쉘이 반환 코드(물론 성공)를 얻을 수 있는 실제 명령을 실행합니다. 때때로 이런 방식으로 작성된 것을 볼 수 있습니다.
||:
이는 약간 더 빠르고 까다롭지만 마술적이지는 않습니다.:
이는 아무 작업도 수행하지 않더라도 성공 오류 코드를 반환하는 쉘 내장 no-op 명령일 뿐입니다.또 다른 접근 방식은 하위 쉘에서 명령을 실행하여
()
하위 쉘 내의 명령이 실패하더라도 하위 쉘이 작업을 완료하여set -e
세트가 있는 상위 스크립트가 종료되지 않도록 이를 래핑하는 것입니다. 이는 단일 명령에 최적이 아니지만 전체 명령 집합을 실행하려는 경우 유용할 수 있습니다.
반면, zip에 의해 생성된 오류 메시지만 표시하지 않으려면 ( 2> /dev/null
)를 사용하여 표준 오류 스트림을 /dev/null로 리디렉션하여 생성된 메시지를 표시하지 않도록 할 수 있습니다(또는 사용하여 끄기 2>&-
).