web-dev-qa-db-ja.com

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

エラーや予期しない動作について、bashの一部のスクリプトで問題が発生しています。修正を適用できるように、問題の原因を調査したいと思います。詳細情報を取得するために、bashのある種の「デバッグモード」を有効にする方法はありますか?

153
Braiam

Bashデバッガ bashdb があり、これは多くのディストリビューションにインストール可能なパッケージです。 bashの組み込みの拡張デバッグモード(shopt -s extdebug)。これはgdbによく似ています。ここにいくつかの味を与えるためのサンプルセッションがあります:

$ 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と同様に、ステートメントは実行される直前beforeに表示されます。したがって、変数を調べて、ステートメントが実行する前に何が実行されるかを確認できます。

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
35
Mark Plotnick

Bashなど、ほとんどのBourneベースのシェルでスクリプトをデバッグする標準的な方法は、set -xスクリプトの上部にあります。これにより、bashが実行/実行されていること、および引数が評価される方法について、bashがより詳細になります。

-x  Print commands and their arguments as they are executed.

これは、インタープリターまたは内部スクリプトのどちらにも役立ちます。例えば:

$ find "$fileloc" -type f -Prune "$filename" -print
+ find /var/adm/logs/morelogs -type f -Prune '-name *.user' -print
find: unknown predicate '-name *.user'
$ find "$fileloc" -type f -Prune $filename -print
+ find /var/adm/logs/morelogs -type f -Prune -name '*.user' -print
find: '/var/adm/logs/morelogs': No such file or directory

上記では、単一引用符が原因でfindが失敗する理由を確認できます。

機能を無効にするには、単にset +x

19
Braiam

Eclipseを使用する

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

シェルの切り替え

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

注:次のようにして変更できます:Window->Preference->シェルスクリプト->通訳

セットアップ手順

Debuggerパッケージには、スクリプトのデバッグに_DEBUG.shスクリプトを使用するための手順が含まれています。これは基本的に(readme.txt)です。

  1. シェルスクリプトプロジェクトの作成:File->新規->その他->シェルスクリプト->Shell Script Project Wizard
  2. Bashスクリプトファイルを作成します:File->新規->ファイル。この例では、script.shになります。拡張子は「.sh」である必要があり、必須です。
  3. ファイル_DEBUG.shをプロジェクトフォルダにコピーします。
  4. 次のテキストをファイルscript.shの先頭に挿入します。

    . _DEBUG.sh
    
  5. ファイルがMicrosoft Windowsで作成されている場合は、必ずFile->変換行区切り文字->Unix

  6. デバッグ起動構成をセットアップします:Run->デバッグ設定->Bashスクリプト...2つありますここで設定するフィールド:

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

  7. デバッグパースペクティブに切り替えます。デバッグセッションを開始します。 bash Shellからscript.shを起動します。

BashデバッグUI

enter image description here

このbashデバッガには、次のような標準プログラミングデバッガのすべての機能があります。

  • ブレークポイント切り替え
  • 単一の段階的な操作
  • ステップイン、ステップアウト、ステップオーバー機能およびサブルーチン
  • スクリプトの実行中の任意の時点でのコードまたは変数の調査

The Shelled(Shell Script Editor)IDE(Integrated Development Environment))には、コンテキストチェックを実行して強調表示するという追加のボーナスがありますスクリプトを正しくインデントしない場合、すぐに多くのエラーにフラグを付けたり、ローカル化したりできる可能性があります。

次に、その他IDEメリットなどがあります。

  • TODOタスクリスト
  • マイリンタスク
  • ブックマークリスト
  • 複数ウィンドウの編集
  • 環境のリモート共有
13
L. D. James

現在、VS Code Bash Debugがあります。

https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug

「ステップイン/アウト/オーバー」があり、各変数の値も表示されます。

VS Code Bash Debug screenshot

素晴らしいリソースが近年登場しました: http://shellcheck.net

通常のbashよりも多く表示されるため、厄介な閉じられていない引用符や中括弧などを簡単に見つけることができます。

機密情報(ips、パスワードなど)をネット上に貼り付けないようにしてください(特にhttpであり、暗号化されていないため)(shellcheckもダウンロードできると思いますが、わかりません)

8
Olivier Dulac

単に使用:

#!/bin/bash -x

シェルについても同じです:

#!/bin/sh -x
6
Gery