0Pricing
DevOps Bootcamp · レッスン

Bashスクリプトのデバッグ(set -x、trap)

実行トレースやエラー処理のための「trap」など、Bashスクリプトをデバッグする方法を学びます。

「Bashスクリプトのデバッグ(set -x、trap)」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。

スクリプトをデバッグする理由

どれほど優れたスクリプトにもバグは発生する可能性があります。デバッグとは、こうしたエラーを見つけて修正する作業です。

デバッグは、あらゆる開発者にとって重要なスキルです。スクリプトがどのように処理を進めているのか、またどこで問題が起きている可能性があるのかを、段階的に理解できるようになります。

このレッスンでは、実行を追跡し、予期しない事象に対処するための強力なBashツールを学びます。

`set -x` でスクリプトを追跡する

Bash で最も簡単かつ効果的なデバッグツールの 1 つが set -x です。これにより、コマンドトレースが有効になります。

  • 有効にすると、Bash は各コマンドとその引数を、実行する直前に標準エラー出力(通常はターミナル)へ表示します。
  • この出力には展開後の変数の状態も含まれるため、Bash がこれから実行しようとしている内容を明確に確認できます。
  • スクリプトの実行をスローモーションで見ているようなものです。

`set -x` の動作を確認する

set -x の動作を確認してみましょう。シェルが変数を展開した後の各コマンドを、+ 記号を先頭に付けて表示していることに注目してください。

次の例を実行してみましょう。

#!/bin/bash

# Enable command tracing
set -x

NAME="Coddy"
MESSAGE="Hello, $NAME!"

echo $MESSAGE

# This command will intentionally fail
ls -l /nonexistent_directory

# Disable command tracing
set +x

echo "Tracing is now off."

トレース出力を理解する

set -x が有効になっていると、+ 記号で始まる行が表示されます。これはトレース出力であることを示しています。

  • + の後には、Bash が実行しようとしているコマンドと、変数やコマンドの置換後の引数が表示されます。
  • 変数の正確な値や、実際に実行されるコマンドを確認するうえで非常に役立ちます。
  • パスの誤り、空の変数、意図しないコマンド構造などの問題を特定しやすくなります。

`set -x` の適用範囲を制御する

スクリプト全体を常にトレースする必要はありません。特定の部分だけで set -x を有効にできます。

  • set -x を使うと、トレースがオンになります。
  • set +x を使うと、トレースがオフになります。

これにより、安定して動作している部分の出力に圧倒されることなく、問題のある部分に集中してデバッグできます。

`trap` でイベントを処理する

trap コマンドを使うと、シグナルやその他のイベントを捕捉し、それらが発生したときにコマンドを実行できます。これは次のような処理に便利です。

  • クリーンアップ: 一時ファイルが確実に削除されるようにします。
  • エラー処理: コマンドの失敗に対応します。
  • 正常な終了: Ctrl+C などによるユーザーの割り込みを処理します。

基本的な構文は trap 'command_to_execute' SIGNAL_OR_EVENT です。

`trap EXIT` でクリーンアップする

EXIT 疑似シグナルは特殊なシグナルです。EXIT でトラップされたコマンドは、スクリプトがどのように終了する場合でも(成功、失敗、割り込みを問わず)、スクリプトが終了する直前に実行されます。

一時ファイルの削除など、クリーンアップ処理に最適です。次のスクリプトを実行してみましょう。

#!/bin/bash

TEMP_FILE="/tmp/coddy_temp_$(date +%s).txt"

# Trap the EXIT signal to remove the temp file
trap 'echo "Cleaning up: Removing $TEMP_FILE"; rm -f "$TEMP_FILE"' EXIT

echo "Script started. Creating temporary file..."
touch "$TEMP_FILE"
echo "Temporary file created: $TEMP_FILE"

# Simulate some work
sleep 2

echo "Script logic completed. Exiting..."

`trap ERR` でエラーを捕捉する

ERR 疑似シグナルは、コマンドがゼロ以外のステータスで終了したとき(つまり、失敗したとき)に発生します。これにより、エラーが発生したときにだけ処理を実行できます。

注意: trap ERR は、コマンドが if、while、until の条件の一部である場合や、戻り値が明示的に確認されている場合(例: command || true)には機能しません。

#!/bin/bash

# Trap ERR to report the error line number
trap 'echo "Error detected on line $LINENO! Exiting."' ERR

echo "Starting script with an intentional error..."

# This command will fail and trigger the ERR trap
ls /this/path/does/not/exist

echo "This line will NOT be reached if an error occurs."

シグナル(INT、TERM)に対応する

trap では、標準的な Linux シグナルも捕捉できます。代表的なものは次のとおりです。

  • INT(Interrupt): Ctrl+C を押したときに送信されます。
  • TERM(Terminate): プロセスを正常に終了するよう要求します。

これらのシグナルをトラップすると、スクリプトを突然終了させるのではなく、終了前にクリーンアップや状態の保存を実行できます。

#!/bin/bash

# Trap INT (Ctrl+C) to exit gracefully
trap 'echo "\nCaught Ctrl+C! Exiting gracefully..."; exit 1' INT

echo "Running a continuous task. Press Ctrl+C to stop."

while true; do
  echo "Working... $(date)"
  sleep 3
done

デバッグ確認

Bash のデバッグ手法についての理解を確認しましょう。

復習: スクリプトをデバッグする

よくできました。Bash スクリプトのデバッグに欠かせないツールを学びました。

  • set -x: コマンドトレースを有効にし、Bash が実行する内容を正確に表示します。set +x で無効にできます。
  • trap: 特定のイベントやシグナルに応じてコマンドを実行できます。
  • `trap EXIT`: スクリプトの終了前にクリーンアップ処理を実行します。
  • `trap ERR`: ゼロ以外のステータスで終了したコマンドを捕捉します。
  • `trap INT`/`TERM`: ユーザーの割り込みや終了要求に適切に対応します。

これらの手法を身につけると、Bash スクリプトのトラブルシューティング能力が大幅に向上し、堅牢なスクリプトを作成できるようになります。

よくある質問

「Bashスクリプトのデバッグ(set -x、trap)」レッスンは無料ですか?

はい。「Bashスクリプトのデバッグ(set -x、trap)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。

「Bashスクリプトのデバッグ(set -x、trap)」で何を学びますか?

実行トレースやエラー処理のための「trap」など、Bashスクリプトをデバッグする方法を学びます。 ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

DevOps Bootcampを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Bashスクリプトのデバッグ(set -x、trap)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このDevOps Bootcampレッスンでコードを書いて実行できますか?

はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Bashスクリプトのデバッグ(set -x、trap)
  2. エラー処理と終了ステータス
  3. スクリプトのベストプラクティスとLint
  4. BatsによるBashスクリプトのテスト
← DevOps Bootcampに戻る