10

これはmyscript.sh次のとおりです。

#!/bin/bash

function mytrap {
    echo "Trapped!"
}
trap mytrap EXIT

exit 3

そして、私がそれを実行すると:

> ./myscript.sh
echo $?
3

スクリプトの終了コードが、トラップがある場合とない場合の終了コードが同じなのはなぜですか? 通常、関数は最後に実行されたコマンドの終了コードを暗黙的に返します。この場合:

  1. エコーは 0 を返します
  2. mytrap私は0を返すことを期待します
  3. は最後に実行された関数であるためmytrap、スクリプトは 0 を返す必要があります

そうでないのはなぜですか?私の考えはどこが間違っていますか?

4

1 に答える 1

10

man bash以下のページを参考にご覧ください。

exit [n] シェルを n のステータスで終了させます。n を省略すると、終了ステータスは最後に実行されたコマンドのステータスになります。EXITのトラップは、シェルが終了する前に実行されます。

それを証明するスクリプトのデバッグ バージョンがあります。

+ trap mytrap EXIT
+ exit 3
+ mytrap
+ echo 'Trapped!'
Trapped!

コメントで述べたのと同じようにtrap、エラーコードを返す関数を考慮してください。

function mytrap {
    echo "Trapped!"
    exit 1
}

スクリプトの拡張版を見て、

+ trap mytrap EXIT
+ exit 3
+ mytrap
+ echo 'Trapped!'
Trapped!
+ exit 1

echo $?
1

trap関数の終了コードをキャプチャするには、

function mytrap {
    echo "$?"
    echo "Trapped!"
}
于 2017-01-12T17:47:03.273 に答える