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スクリプトでのスタックトレースと呼び出し元の配列を取得することができます。エラーハンドリングやデバッグに役立つため、重要なスクリプトで利用することをおすすめします。