어린이

어린이

내 임무는 구분된 파일을 업로드하고 처리하는 것입니다. 처리가 완료되면 성공했다고 말하고, 구문 분석에 실패하면 오류를 발생시켜야 합니다. 파일을 아래 첨자로 한 줄씩 읽은 다음 기본 스크립트에서 처리합니다(그래서 읽는 동안 ifs를 사용할 수 없습니다).

모든 줄이 구문 분석되는 경우를 대비해 이름을 .done으로 바꾸겠습니다. 이제 EOF에 도달하기 전에 오류가 발생하면 이름을 .err로 바꿀 수 있는지 알고 싶습니다. 내 파일 끝에 개행 문자가 없으면 어떻게 되나요?

주요 구조는 다음과 같습니다.

Main script:
Calls parent script with filepath
gets the fileName and no of line in the files, calls the Child script with a nth line no in a loop until total no of lines are reached

Parent script:
#some validations to get the txt file from the list of files
... 
fileName=`ls -A1 *.txt`
...

Child script:
...
lineno=$1
fileName=$2
noOfLines=$3
line=`tail -$lineno $fileName | head -n1`

if [ $lineno -eq $noOfLines ] 
then
    noExt="${fileName%.*}"
    mv "$fileName" "$noExt.done" #success case
fi

이제 오류가 있거나 구문 분석에 실패한 경우 파일 이름을 .err로 바꿔야 합니다. 오류를 어떻게 잡을 수 있나요?

답변1

사용종료 코드그 메시지를 전달하세요. 팔로우하고 싶다면협약, 예를 들어 사용할 수 있습니다.

EX_DATAERR=65 

상위 프로세스에 구문 분석 오류를 전달하는 코드:

어린이

exit "$EX_DATAERR"

부모

 case "$?" in  #$? is the exit code of the last exited child
              0) echo 'Child has exited succesfully';;
  "$EX_DATAERR") echo 'Child has experienced a parsing error';;
              *) echo 'Child has experienced an unknown error';;
esac

오류 처리에 관한 한 셸은 C++보다는 C에 더 가깝습니다. 던지지 않습니다. 모든 오류는 호출 수신자에 의해 반환되어야 하며(프로세스의 경우 전역 errno가 없기 때문에 종료 코드로)(파일 시스템을 사용하는 것이 어색할 수 있음) 호출자는 명시적으로 오류를 확인해야 합니다.

set -e그러나 종료 상태가 확인되지 않은 하위 항목(예: 명령문에서 if)이 0이 아닌 종료 상태를 반환하는 경우 셸에서 다음을 수행하면 셸이 오류와 함께 종료됩니다. 이는 잡을 수 없는 예외를 던지는 것과 비슷합니다.

관련 정보