web-dev-qa-db-ja.com

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

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

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

31
UAdapter

はい、 Bash Debugger Project があります。

実行時にset -xおよびset -vを使用することもできます。詳細:

http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/debugging.htmlhttp://www.cyberciti.biz/tips/debugging-Shell-script.html

幸運を!

18
danizmax

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

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

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

  • スクリプトファイルのShebangを#!/bin/bash -xvに置き換えます

20
NES

現在、 Visual Studio Code Bashデバッグ拡張機能 があります。 「ステップイン/アウト/オーバー」があり、各変数の値を表示できます。

VS Code Bash Debug screenshot

shellcheckは町で最高です-

http://www.shellcheck.net/

また、vimと統合することもできます。これがgitリポジトリです。

https://github.com/koalaman/shellcheck

6
ramgorur

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

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
lepe

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には実際には多くの機能がありますが、シェル組み込みツールであるためマンページはありません。セットのマニュアルは GNU Bash documentation にあります。

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

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

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

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

Bashシェルには、デバッグ用の優れたオプションもいくつかあります。 options --debugger-v verbose、--dump-strings、およびその他の便利なオプション。 man bashを使用してチェックアウトします。

trapコマンド(組み込みのシェル)は非常に役立つ場合があります。トラップは、プログラムが予期せず終了した場合、何かを実行します。トラップ、およびその他の便利なBash Shellビルトインについて読みます here

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

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

2
j0h

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

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

次の機能が含まれます。
https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script

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

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

デバッグパースペクティブ: Eclipse Script Debug Perspective

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

1
L. D. James