シェルデバッグ

  

この記事では、echo、tee、trapなどのコマンドを使用したキー情報の出力、変数の値の追跡、スクリプト内でのデバッグフックの埋め込みなどのシェルスクリプトデバッグテクノロジを包括的かつ体系的に紹介しました。シェルスクリプトの構文チェックを実行し、シェルスクリプトを1つずつ追跡するには "-x"オプションを使用し、 "-x"オプションの出力情報を強化するにはシェルの組み込み変数を賢く使用します。 1.はじめに

シェルプログラミングはUnix /Linuxの世界で広く使用されていますシェルプログラミングの習得は優れたUnix /Linux開発者およびシステム管理者にとっても必須です。スクリプトデバッグの主なタスクは、スクリプトエラーの原因を突き止め、スクリプトソースコード内でエラーが発生した行を見つけることです - 一般に使用される方法は、出力エラー情報の分析、およびスクリプトへのdebugステートメントの追加によるエラー診断に役立つデバッグ情報の出力です。デバッグツールなどを使うしかし、他の高級言語と比較して、シェルインタプリタには対応するデバッグメカニズムとデバッグツールが欠けています出力エラー情報は、多くの場合、不明瞭です。他に方法はありませんが、エラーを診断するために多数のエコーステートメントに頼ることは本当に理解できないので、一般的な初心者はシェルスクリプトをデバッグするのが難しすぎると不平を言います。この記事では、シェル初心者に役立つことを期待して、いくつかの重要なシェルスクリプトのデバッグ手法を体系的に紹介します。

この記事の対象読者は、Unix /Linux環境の開発者、テスター、およびシステム管理者であり、読者に基本的なシェルプログラミングの知識が必要です。この記事で使用した例はBash 3.1 + Redhat Enterprise Server 4.0でテストされていますが、デバッグ手法は他のシェルにも適用されるはずです。

次に、シェルスクリプトでデバッグ情報を出力する

プログラムにデバッグステートメントを追加して、重要な場所やエラーに関する情報を表示するのが最も一般的なデバッグ方法です。シェルプログラマは通常、echo(kshプログラマはよくprintを使用します)ステートメントを使用して情報を出力しますが、情報をトレースするためにechoステートメントの出力だけに頼るのは面倒です。 1回削除します。この節では、デバッグ情報を簡便かつ効率的に出力する方法について主に紹介します。

1. trapコマンドの使用

trapコマンドは、指定された信号をキャプチャして事前定義されたコマンドを実行するために使用されます。基本的な構文は次のとおりです。trap 'command' signalここで、signalはキャプチャするシグナル、commandは指定したシグナルをキャプチャした後に実行するコマンドです。システム内で使用可能なすべてのシグナル名を確認するには、kill– lコマンドを使用できますシグナルをキャプチャした後に実行されるコマンドは、任意の1つ以上の有効なシェルステートメント、または関数名です。シェルスクリプトが実行されると、3つのいわゆる疑似シグナルが生成されます。3つのシグナルはシェルによって生成され、その他のシグナルは<によって引き起こされます。オペレーティングシステム
)では、trapコマンドを使用してこれら3つの「疑似信号」と出力関連情報をキャプチャすることで、デバッグに非常に役立ちます。


表1.シェル疑似信号signal nameがEXITの場合関数から終了するかスクリプト全体が実行される場合ERRコマンドがゼロ以外の状態を返した場合(コマンドの実行に失敗したことを表します) DEBUGスクリプトの各コマンドが実行される前に

EXITシグナルをキャプチャすることで、シェルスクリプトが実行を中断したり関数を終了したりするときに追跡したい変数の値を出力することができます。実行状態とエラーの原因は次のとおりです。trap 'command' EXITまたはtrap 'command' 0

ERR信号をキャプチャすることで、失敗したコマンドまたは関数を簡単にトレースし、関連するエラーを出力できます。次のデバッグ情報は、ERR信号をキャプチャするためのサンプルプログラムです。$ LINENOは、シェルスクリプトの現在の行番号を表すシェル組み込み変数です。

$ cat -n exp1.sh 1 ERRTRAP()2 {3 echo" [LINE:$ 1]エラー:コマンドまたは関数がステータス$?" 4で終了しました。4} 5 foo()6 {7 return 1; 8} 9 trap 'ERRTRAP $ LINENO' ERR 10 abc 11 foo

出力は次のとおりです。

$ sh exp1.sh exp1.sh:行10:abc:コマンドが見つかりません[LINE:10]エラー:コマンドまたは関数がステータス127で終了しました。[LINE:11]エラー:コマンドまたは関数がステータス1で終了しました。

デバッグ処理では、特定の変数の値を追跡するために必要なものです。関連する変数の値を表示するためにシェルスクリプト内の多くの場所に同じエコーステートメントを挿入するのは面倒で不器用です。 DEBUGシグナルをキャプチャーすることによって、関連する変数の追跡を完了するためのtrapステートメントだけが必要になります。

次に、DEBUGシグナルをキャプチャして変数を追跡するプログラムの例を示します。

$ cat– n exp2.sh 1#!/bin /bash 2 trap 'echo' :$ LINENO、a = $ a、b = $ b、c = $ c - 'DEBUG 3 a = 1 4 [[$ a" -eq 1] 5の場合6 b = 2 7それ以外の場合8 b = 1 9 Fi 10 c = 3 11 echo" end>

出力は次のようになります。

$ sh exp2.sh(行の実行前):3、a =、b =、c =行の実行前:4、a = 1、b =、c =実行前行:6、a = 1、b =、c =実行前行:10、a = 1、b = 2、c =実行前行:11、a = 1、b = 2、c = 3 end

実行結果から、各コマンドの実行後に関連する変数の値が変化することは明らかです。同時に、実行結果に出力されている行番号から、スクリプト全体の実行軌跡を確認し、どの条件分岐が実行され、どの条件分岐が実行されないかを判断できます。

2. teeコマンドの使い方

シェルスクリプトでは、パイプラインと入出力のリダイレクトが非常によく使われていますが、その動作の下では、いくつかのコマンドの実行結果がそのまま次のコマンドになります。入力してください。パイプで接続されたコマンドのバッチの実行結果が予想どおりではないことがわかった場合は、各コマンドの実行結果を調べて問題の場所を特定する必要がありますが、パイプを使用するため、これらの中間結果は表示されません。画面上では、デバッグが難しく、teeコマンドを使用することができます。

Copyright © Windowsの知識 All Rights Reserved