子供

子供

私の使命は、区切られたファイルをアップロードして処理することです。処理が完了すると成功したと言い、解析に失敗した場合はエラーが発生するはずです。ファイルを下付き文字で1行ずつ読み込み、デフォルトのスクリプトで処理します(読み込み中は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)がゼロ以外の終了ステータスを返す場合、シェルで次の操作を実行すると、シェルはエラーで終了します。これは、キャッチできない例外をスローするのと似ています。

関連情報