2

環境:

次の擬似コードを実行するbashスクリプト(実際には他のスクリプトのラッパー)があります。

do a main function
if the main function returns:
    $returncode = $? #most recent return code
if the main function runs longer than a timeout:
    kill the main function
    $returncode = 140 #the semi-canonical "exceeded allowed wall clock time" status

run a cleanup function
if the cleanup function returns an error: #nonzero return code
    exit $? #exit the program with the status returned from the cleanup function
else #cleanup was successful
    ....

質問:

最後の行の後に何が起こるべきですか?

クリーンアップ関数は成功したが、メイン関数は成功しなかった場合、プログラムは 0 (クリーンアップが成功した場合) を返す必要$returncodeがありますか、それともメイン関数の (ゼロ以外で失敗した可能性がある) リターン コードを含む を返す必要がありますか?

特定のアプリケーションの場合、答えは簡単です。「それは、スクリプトが何のために必要かによって異なります」。

ただし、これはより一般的/標準的な質問です (そして、これが間違った場所である場合は、火で殺してください): Bash (または一般的に Linux) プログラミングでは、通常、「意味する」というステータスを返しますか?何か (つまり$returncode) またはそのような主観を無視して、単に最新の関数のコードを返しますか?

これは Bash 固有のものではありません。何らかの種類のスタンドアロンの実行可能ファイルがある場合、これらの場合に標準的にどのように動作する必要がありますか? 明らかに、これはやや議論の余地があります。そういう制度があっても無視する人が多いと思います。それでも、私は知りたいです。

乾杯!

4

1 に答える 1

4

main から終了コードを返します。スクリプトのユーザーとして、失敗後にクリーンアップされたかどうかではなく、スクリプトが機能したかどうかを知りたいです。実際、プログラム/スクリプトが失敗したときに適切にクリーンアップされることを期待しているため、0 を返すと誤解を招く可能性があります。

遅延して作成されたスクリプトは、最後のコマンドがたまたま持っていた終了コードを返すだけです。よく書かれたものは、意味のある終了コードを返すようにします。


ところで、適切なクリーンアップを確実にするための私のお気に入りの方法は、 でクリーンアップ関数を実行することtrap EXITです。

WORKING_DIR=$(mktemp -d)

cleanUp() {
    rm -rf "$WORKING_DIR"
}

# Run cleanUp() when the script exits, whether that's from a SIGTERM/SIGINT or
# just exiting normally.
trap cleanUp EXIT
于 2012-08-28T21:32:02.523 に答える