2025/07/17 12:51 Debugging Bash Like a Sire

やあ、ロボ子。今日のITニュースは、Bashスクリプトのデバッグに関するものじゃ。

Bashスクリプトですか、博士。なんだか難しそうですね。

難しくなんかないぞ!この記事によると、`log::error`関数が`log::info`と同じようにログを出力するように調整されたらしいのじゃ。

`log::error`と`log::info`ですか。ログレベルに応じて出力を変えるのですね。

そうじゃ!さらに、`$FUNCNAME[@]`の各項目を`stack_id`としてループ処理するらしい。

`FUNCNAME`ですか。関数名を取得する変数ですね。

その通り!配列展開の先頭に感嘆符をつけると、値の代わりにインデックスを取得できるらしいぞ。`BASH_SOURCE`と`FUNCNAME`の両方の配列を反復処理できるのじゃ。

インデックスを取得ですか。ちょっとしたテクニックですね。

`stack_id`ごとに1行出力して、新しい変数`BASH_LINENO`から値を取得するらしい。`BASH_SOURCE`と`FUNCNAME`はスクリプトのファイル名とデフォルトの`main`関数名で設定されるのじゃ。

`BASH_LINENO`は行数ですね。スタックトレースに役立ちそうです。

`BASH_LINENO`は関数が実行されるまで最初の値を取得しないから、最初の値は無視するらしいぞ。

なるほど、最初の値は役に立たないのですね。

この記事では、デバッグに役立つオプションも紹介されているぞ。`-e`、`-u`、`-x`、`-o pipefail`じゃ。

これらのオプションは便利ですが、Bashのバージョンによって動作が異なる場合があるのですね。

そうそう。問題がどこにあるか教えてくれるとは限らないから注意が必要じゃ。

ログレベルに基づいてログ出力を制御する関数も紹介されていますね。`log::info`、`log::level_is_active`、`_write_log`ですね。

`BASH_SOURCE`変数でファイル名、`FUNCNAME`変数で関数名をログに出力するのじゃ。

ログ出力を標準エラー出力にリダイレクトするのですね。

グローバル変数を使ってスクリプトの動作を制御するのも重要じゃ。

必要な変数を明示的に指定することで、`-u`フラグを設定し忘れた場合のエラーを回避するのですね。

エラーログの記述を忘れた場合に備えて、Bashのトラップを使うと、スクリプトが非ゼロの結果で突然終了した場合でも、エラーログとスタックトレースを取得できるのじゃ。

なるほど。エラー発生時の情報収集も自動化できるのですね。

そういうことじゃ!これでロボ子もBashスクリプトのデバッグマスターじゃな!

まだまだ博士には及びませんが、頑張ります!

ところでロボ子、デバッグ中に一番よく使う呪文って知ってるか?

呪文ですか?なんでしょう?

それはもちろん…「print debug」じゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。