모든 줄에 `||exit$?`를 추가하지 않고 오류 중단 스크립트를 작성하는 방법은 무엇입니까?

모든 줄에 `||exit$?`를 추가하지 않고 오류 중단 스크립트를 작성하는 방법은 무엇입니까?

계속하는 대신 마지막으로 실패한 명령의 오류 코드로 종료해야 하는 bash 스크립트를 작성 중입니다. Everywhere 를 추가하면 이 작업을 수행할 수 있지만 , 보기 흉한 모든 줄 없이 이 작업을 수행하기 위해 처음에 옵션을 선택하는 || exit $?것과 같은 더 쉬운 방법이 있습니까 ?set

답변1

set -e?

set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
Set or unset values of shell options and positional parameters.

Change the value of shell attributes and positional parameters, or
display the names and values of shell variables.

 Options:
   -a  Mark variables which are modified or created for export.
   -b  Notify of job termination immediately.
   -e  Exit immediately if a command exits with a non-zero status. 
...

답변2

블록 끝에서 &&사용하여 모든 명령을 연결할 수 있습니다. || exit $?예를 들어:

#!/usr/bin/ksh
ls ~/folder &&
cp -Rp ~/folder ~/new_folder &&
rm ~/folder/file03.txt &&
echo "This will be skipped..." ||
exit $?

파일이 없으면 ~/folder/file03.txt마지막 명령을 건너뜁니다. echo다음과 같은 내용을 받아야 합니다.

$ ./script.ksh
file01.txt  file02.txt
rm: cannot remove /export/home/kkorzeni/folder/file03.txt: No such file or directory
$ echo $?
1

감사합니다, 크시슈토프

답변3

스크립트에서 발생하는 모든 오류를 포착하기 위해 트랩 기능을 정의할 수 있습니다.

#!/usr/bin/ksh
trap errtrap

function errtrap {
    es=$?
    echo "`date` The script failed with exit status $es " | $log
}

나머지 스크립트는 다음과 같습니다.

TRAP은 모든 명령에 대한 오류를 포착하고 이 errtrap함수를 호출합니다. 더 나은 사용을 위해 errtrap함수를 일반으로 만들고 생성한 스크립트에서 호출할 수 있습니다.

관련 정보