Bashでのスタックトレースと呼び出し元の配列の取得方法


Bashスクリプトでスタックトレースを取得する方法の一つは、以下のようにシェルオプションを設定することです。

#!/bin/bash
set -eE
function print_stack_trace {
  local i=0
  local stack_size=${#FUNCNAME[@]}
  echo "Stack Trace:"
  for ((i=1; i<$stack_size; i++)); do
    echo "  File: ${BASH_SOURCE[$i]}, Function: ${FUNCNAME[$i]}, Line: ${BASH_LINENO[$i-1]}"
  done
}
function foo {
  echo "Calling bar..."
  bar
}
function bar {
  echo "An error occurred!"
  print_stack_trace
}
foo

上記の例では、set -eEを使用してエラーが発生した場合にスクリプトを終了し、print_stack_trace関数を呼び出してスタックトレースを表示しています。FUNCNAME配列は、現在の関数の名前を、BASH_SOURCE配列は、現在のスクリプトファイルのパスを、BASH_LINENO配列は、エラーが発生した行番号を格納しています。

また、スタックトレースの取得方法として、callerコマンドを使用する方法もあります。以下の例をご覧ください。

#!/bin/bash
function print_stack_trace {
  local i=0
  echo "Stack Trace:"
  while caller $i; do
    ((i++));
  done
}
function foo {
  echo "Calling bar..."
  bar
}
function bar {
  echo "An error occurred!"
  print_stack_trace
}
foo

上記の例では、callerコマンドを使用してスタックトレースを取得し、print_stack_trace関数で表示しています。callerコマンドは、呼び出し元の行番号とスクリプトファイル名を出力します。

これらの方法を使用することで、Bashスクリプトでのスタックトレースと呼び出し元の配列を取得することができます。エラーハンドリングやデバッグに役立つため、重要なスクリプトで利用することをおすすめします。