萌えハッカーニュースリーダー

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

出典: https://blog.brujordet.no/post/bash/debugging_bash_like_a_sire/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

それはもちろん…「print debug」じゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search