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

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

エラーと予期しない動作に関連するbashのいくつかのスクリプトにはいくつかの問題があります。問題の原因を調べて修正を適用したいと思います。 Bashからより多くの情報を得るために、ある種の「デバッグモード」を有効にする方法はありますか?

答え1

次のコマンドを使用してbashスクリプトを起動するbash -x ./script.shか、スクリプトに追加してset -xデバッグ出力を確認してください。


bashバージョン4.1以降の追加機能:

デバッグ出力を別のファイルに書き込むには、次のスクリプトを追加します。

exec 5> debug_output.txt
BASH_XTRACEFD="5"

望むより:https://stackoverflow.com/a/25593226/3776858


行番号を表示するには、以下を追加してください。

PS4='$LINENO: '


loggerコマンドへのアクセス権がある場合は、タイムスタンプ、スクリプト名、行番号など、システムログを介してデバッグ出力を作成できます。

#!/bin/bash

exec 5> >(logger -t $0)
BASH_XTRACEFD="5"
PS4='$LINENO: '
set -x

# Place your code here

-pコマンドオプションを使用して個々の施設とレベルを設定し、loggerローカルシステムログを介して独自のログファイルに出力を書き込むことができます。

答え2

使用set -x

私はいつもとset -xを使用しますset +x。何が起こっているのかを確認したい領域をラップして、詳細レベルを上げ下げすることができます。

#!/bin/bash

set -x
..code to debug...
set +x

log4bash

また、開発作業を行ったことがあり、log4j、log4perlなどのロガースタイルに精通している場合は、次のものを使用することをお勧めします。log4bash

抜粋

現実を直視しよう - 普通で古いEchoはそれを切らないでしょう。 log4bashは、Bashスクリプトでより良いロギングを提供する試みです(つまり、Bashでより少ないロギング)。

ここでは、Bashスクリプトで次のことができます。

#!/usr/bin/env bash
source log4bash.sh

log "This is regular log message... log and log_info do the same thing";

log_warning "Luke ... you turned off your targeting computer";
log_info "I have you now!";
log_success "You're all clear kid, now let's blow this thing and go home.";
log_error "One thing's for sure, we're all gonna be a lot thinner.";

# If you have figlet installed -- you'll see some big letters on the screen!
log_captains "What was in the captain's toilet?";

# If you have the "say" command (e.g. on a Mac)
log_speak "Resistance is futile";

次の種類の出力を生成します。

    SS1

log4sh

より移植性の高いものが必要な場合は、log4sh次のような古いバージョンがありますlog4bash

答え3

bashデバッガがあります。バッシュデータベース、これは多くのディストリビューションにインストール可能なパッケージです。 Bashに組み込まれている拡張デバッグモード(shopt -s extdebug)を使用してください。以下は参照用のサンプルセッションです。

$ ls
1st.JPG  2ndJPG.JPG
$ cat ../foo.sh
for f in *.JPG
do
  newf=${f/JPG/jpg}
  mv $f $newf
done
$ bashdb ../foo.sh
(foo.sh:1):
1:      for f in *.JPG
bashdb<0> next
(foo.sh:3):
3:        newf=${f/JPG/jpg}
bashdb<1> next
(foo.sh:4):
4:        mv $f $newf

gdbと同様に、この文は次の内容のみを表示します。今後まもなく実行される予定です。したがって、ステートメントが実行される前に変数を確認して、ステートメントが実行する操作を知ることができます。

bashdb<2> print $f $newf
1st.JPG 1st.jpg
bashdb<3> next
(foo.sh:1):
1:      for f in *.JPG
bashdb<4> next
(foo.sh:3):
3:        newf=${f/JPG/jpg}
bashdb<5> next
(foo.sh:4):
4:        mv $f $newf
bashdb<6> print $f $newf
2ndJPG.JPG 2ndjpg.JPG

これは私たちが望むものではありません!パラメータ拡張についてもう一度見てみましょう。

bashdb<7> print $f ${f/JPG/jpg}
2ndJPG.JPG 2ndjpg.JPG
bashdb<8> print $f ${f/JPG$/jpg}
2ndJPG.JPG 2ndJPG.JPG
bashdb<9> print $f ${f/%JPG/jpg}
2ndJPG.JPG 2ndJPG.jpg

さて、動作します。newf正しい値に設定してみましょう。

bashdb<10> eval newf=${f/%JPG/jpg}
$? is 0
bashdb<11> print $f $newf
2ndJPG.JPG 2ndJPG.jpg

よさそうだねスクリプトを続行してください。

bashdb<12> next
Debugged program terminated normally. Use q to quit or R to restart.
$ ls
1st.jpg  2ndJPG.jpg

答え4

Eclipseを使う

以下のリンクされた "_DEBUG.sh"スクリプトを使用すると、EclipseとShelledの組み合わせ環境を使用できます。

スイッチシェル

デフォルトでは、Shelled開発ツールは/bin/dashインタプリタとして使用されます。/bin/bashWebと私の環境のほとんどのシェルの例との互換性が向上するように変更しました。

メモ:次の方法でこの設定を変更できます。->好み->シェルスクリプト->通訳

設定手順

デバッガパッケージには、デフォルト_DEBUG.shでscriptsを使用してスクリプトをデバッグするための手順が含まれています(readme.txt)。

  1. シェルスクリプトプロジェクトを作成します。 文書->新しい->その他->シェルスクリプト->シェルスクリプトプロジェクトウィザード
  2. Bashスクリプトファイルを作成します。文書->新しい->文書。この例では、script.sh拡張子は「.sh」でなければならず、必須です。
  3. ファイルを_DEBUG.shプロジェクトフォルダにコピーします。
  4. ファイルの上部に次のテキストを挿入しますscript.sh

    . _DEBUG.sh
    
  5. ファイルがMicrosoft Windowsで作成されている場合は、必ず以下を実行してください。文書->行区切り文字を次に変換->Unix

  6. デバッグ開始構成を設定します。走る->デバッグ構成->バッシュスクリプト...設定する必要があるフィールドは2つです。

    a) "Bash スクリプト:" - デバッグする Bash スクリプトへの Eclipse ワークスペースへのパスです。
    e) 「デバッガポート:」 33333

  7. 「デバッグ」の視点に切り替えます。デバッグセッションを開始します。script.shbash シェルで実行します。

Bash デバッグユーザーインターフェイス

ここに画像の説明を入力してください。

バッシュデバッガ次の標準プログラミングデバッガのすべての機能を備えています。

  • ブレークポイントの切り替え
  • シングルステップ操作
  • 関数とサブルーチンを段階的に実行、段階的に実行
  • スクリプトの実行中はいつでもコードまたは変数を確認してください。

皮をむいた(シェルスクリプトエディタ)統合開発環境(IDE)には、スクリプトの作成中にコンテキストの確認、ハイライト、インデントを実行するという利点があります。インデントが正しくない場合は、すぐに多くのバグを表示/ローカライズできます。

そしてそこにその他のIDEの利点たとえば、

  • TODOタスクリスト
  • マイリンミッション
  • ブックマーク一覧
  • マルチウィンドウ編集
  • リモート共有環境

関連情報