bashスクリプトをデバッグする方法は?


31

エコーとログを使用せずにbashスクリプトをデバッグする方法はありますか?

私はブレークポイントとそのようなものの使用について話している。

回答:



20

いくつかの異なる方法があります、すなわち:

  • -xオプションを使用してスクリプトを実行します

    bash -x yourscript.sh
  • スクリプトファイルの先頭set -x、Shebangの後、#!/bin/bashスクリプトの先頭の前に新しい行を追加するとset -v、シェルの入力行がset -x表示され、実行されたコマンドと引数が表示されます

  • スクリプトファイルのシェバンを次のように置き換えます #!/bin/bash -xv




4

この小さな関数を使用して、「コンソール」にドロップできます。

function debug
{
    echo "#############|  Entering DEBUG mode  |####################";
    cmd=""
    while [[ $cmd != "exit" ]]; do
        read -p "> " cmd
        case "$cmd" in
            vars ) ( set -o posix ; set );;
            exit ) ;;
            * ) eval "$cmd";;
        esac
    done
    echo "#############|  End of DEBUG mode |####################";
}

次に、スクリプト内で(例):

for file in *; do
...
   if [[ $file == "strange_case.txt" ]]; then
       # break the code here to analyze:
       debug
   fi
...
done

ローカル変数をそのままにして、コマンドを受け入れます。「デバッグ」モードを終了するには、「exit」と入力し(スクリプトを終了しません)、コードを続行します。ループ内で「デバッグ」を使用すると、毎回停止します。(上記の例のように)「if」で囲むか、「ウォッチ」関数を作成できます。

function debug_watch
{
    if [[ $1 == $2 ]]; then
        debug
    fi
}

# And Use it:

debug_watch "$file" "strange_case.txt"

また、使用可能なすべての変数とその値をダンプする「vars」コマンドも追加しました。独自のカスタマイズされたコマンドも追加できます。

数分でコードを作成したので、自己責任で使用してください。デバッグモードでは任意のコマンドを実行できるため、本番スクリプトに残すとセキュリティ上のリスクが生じることに注意してください。


3
大文字の変数名を使用しないでください。特別なシェル変数と環境変数をオーバーライドするリスク。また、パラメータ分割を引数として使用する場合は、パラメータ分割を引用符で囲み、結果で単語の分割やパス名の拡張が発生しないようにしてください。例えば* ) eval "$cmd" ;;debug_watch "$file" strange_case.txt
ガイラ

geirhaが提案するようにコードを編集しました。
lepe

2

NESが言っていることに合わせて、bashにデバッグ用のフラグを設定します。

set -xフラグが設定され、端末から、またはスクリプト内からいずれかの設定を解除することができます。+またはを使用-

#!/bin/bash
#fileinfo
ls -l $1
set -x      # start debugging here
wc -l $1
set +x      # stop debugging here
file $1
set -v      # start verbose output
w | more    
echo ""
echo -n "Number of users: "
set +v      # end verbose output
who | wc -l

ここでは何setのコマンドが実行します。

  • set -f メタキャラクターを使用したファイル名の生成を無効にします。
  • set -v 読み取られたとおりに(詳細な)シェル入力行を出力します。
  • set -x コマンドを実行する前にコマンドトレースを出力します。

set実際には多くの機能がありますが、シェル組み込みツールであるため、manページはありません。セットのマニュアルはGNU Bashのドキュメントにあります

次のようなプログラムの詳細を取得するのに役立つコマンドラインツールが多数あります。

  • stat ファイルまたはファイルシステムのステータスを表示する
  • file ファイルの種類を決定します。
  • hexdump 指定されたファイルをさまざまな形式で表示するフィルター
  • nohup ハングしないスクリプトを実行する

    その他多数。隠されたキャラクターを表示するコマンドを考えていましたが、今はできません。Hexdumpはそれを行いますが、より良いものがあります。

キーコマンドctrl\は、実行中のプログラムまたはスクリプトをコアダンプします。その後、コアダンプを分析できます。おそらくgdbを使用してコアダンプを分析しますが、そのための多くのプログラムが存在します。

bashシェルには、デバッグ用の気の利いたオプションもいくつかあります。options --debugger-vverbose、--dump-stringsおよびその他の気の利いたオプションが役立ちます。を使用してチェックアウトしman bashます。

trapコマンド(に建てられたシェル)があなたのために非常に有用である可能性があります。トラップは、プログラムが予期せず終了した場合、何かを実行します。トラップ、およびその他の便利なBash Shellビルトインについては、こちらをご覧ください

今のところ一般的に言えば、デバッグはどの言語でも大きなトピックです。プログラミング言語でのデバッグに役立つ他のトピックには、シェルリダイレクト、信号処理などがあります。

最後に、私が使用した例は些細なものであることに気づきましたが、一部のシェルスクリプトは数百行になることもあります。そのような状況では、コメントタグを挿入し、問題があると思われるコードをブロックするか、または、終了コマンドを挿入し、分割統治法を使用して、破損したコードから機能コードを分離しようとします。


1

bashスクリプトをデバッグするためのGUIオプションは、BashEclipse / Shelledプラグインを備えたEclipse IDEです。

これにより、質問の機能(breakpoints and stuff)と、複雑なbashスクリプトをデバッグするための他の多くの機能が提供されます。

機能の一部は次のとおりです:
https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script

  • ブレークポイント切り替え
  • シングルステップバイステップ操作
  • ステップイン、ステップアウト、ステップオーバー機能およびサブルーチン
  • スクリプトの実行中の任意の時点でコード変数を調べる
  • TODOタスクリスト
  • ブックマークリスト
  • 複数ウィンドウの編集
  • プロジェクト環境のリモート共有

スクリプトエディターパースペクティブ: EclipseスクリプトIDE

デバッグの観点: Eclipseスクリプトデバッグパースペクティブ

を使用する手順はShelledBashEclipseEclipseにとプラグインを追加することです。次に、BashEclipse read meテキストファイルで提供されている手順を実行して、デバッガーを起動します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.