孩子

孩子

我的任务是上传分隔文件并对其进行处理。一旦处理完成,我要么说它成功,如果解析失败,我需要抛出错误。我在子脚本中逐行读取该文件,然后在主脚本中处理它(所以我在读取时不能使用 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

就错误处理而言,shell 类似于 C 而不是 C++。它不会抛出。每个错误都必须由被调用者返回(对于进程来说,通过其退出代码返回,因为没有全局 errno(使用文件系统会很笨拙),并且调用者必须显式检查错误。

set -e但是,如果未检查其退出状态(例如,在语句中if)的任何子级返回非零退出状态,您可以在 shell 中执行以下操作,导致 shell 退出并出现错误。这有点像抛出一个无法捕获的异常。

相关内容