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