プログラムが正常に完了した後に終了するのか、エラーやその他の理由で早期に終了するのかを「トラップ」に知らせる方法

プログラムが正常に完了した後に終了するのか、エラーやその他の理由で早期に終了するのかを「トラップ」に知らせる方法

質問:

trap私が書いたシェルプログラムがありますが、クリーンアップのために最後にキャプチャされるか、またはいくつかのコマンドのバグが原因でどのようにクリーンアップされるかを確認する方法がわかりません。

コードは次のとおりです。

################################### Successful exit then this cleanup ###########################################################3

successfulExit()
{
    IFS=$IFS_OLD
    cd "$HOME" || { echo "cd $HOME failed"; exit 155; }
    rm -rf /tmp/svaka || { echo "Failed to remove the install directory!!!!!!!!"; exit 155; }
}
###############################################################################################################################33
####### Catch the program on successful exit and cleanup
trap successfulExit EXIT

質問:

手順が完了した後trapにのみどうすればよいですか?trap EXIT

完全なスクリプトは次のとおりです。

debianConfigAwsome.5.3.sh

答え1

EXITトラップに入ったときの$?終了ステータスを含みます。これは、他のシェルでこのスクリプトを呼び出した場合に見つかるのと同じ値です$?。つまり、渡された引数exit(0から255の範囲に切り捨てられた)または前のコマンドの戻り状態です。終了の場合、set -eコマンドの戻り状態は暗黙的にトリガされますexit

$?通常、同じ状態で保存してもう一度終了する必要があります。

cleanup () {
  if [ -n "$1" ]; then
    echo "Aborted by $1"
  elif [ $status -ne 0 ]; then
    echo "Failure (status $status)"
  else
    echo "Success"
  fi
}
trap 'status=$?; cleanup; exit $status' EXIT
trap 'trap - HUP; cleanup SIGHUP; kill -HUP $$' HUP
trap 'trap - INT; cleanup SIGINT; kill -INT $$' INT
trap 'trap - TERM; cleanup SIGTERM; kill -TERM $$' TERM

答え2

許可された回答に問題がある場合は、cleanup最終的に複数回呼び出すことができます。トラップの削除をクリーンアップ機能に移動して解決しました。

cleanup () {
  local exit_status=$?
  local exit_signal="$1"
  if [ -n "$exit_signal" ]; then
    echo "Aborted by $1"
  elif [ $exit_status -ne 0 ]; then
    echo "Failure (status $exit_status)"
  else
    echo "Success"
  fi
  trap - EXIT HUP INT TERM
  return $exit_status
}

trap cleanup EXIT
trap 'cleanup SIGHUP; kill -HUP $$' HUP
trap 'cleanup SIGINT; kill -INT $$' INT
trap 'cleanup SIGTERM; kill -TERM $$' TERM

関連情報