エラーや予期しない動作について、bashの一部のスクリプトで問題が発生しています。修正を適用できるように、問題の原因を調査したいと思います。詳細情報を取得するために、bashのある種の「デバッグモード」を有効にする方法はありますか?
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
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
。
以下にリンクされている「_DEBUG.sh」スクリプトを使用して、EclipseとShelledを組み合わせた環境を使用できます。
デフォルトでは、Shelled開発ツールは/bin/dash
をインタープリターとして使用します。これを/bin/bash
に変更して、Webおよび私の環境のほとんどのシェルの例との互換性を向上させました。
注:次のようにして変更できます:Window->Preference->シェルスクリプト->通訳
Debuggerパッケージには、スクリプトのデバッグに_DEBUG.sh
スクリプトを使用するための手順が含まれています。これは基本的に(readme.txt)です。
- シェルスクリプトプロジェクトの作成:File->新規->その他->シェルスクリプト->Shell Script Project Wizard。
- Bashスクリプトファイルを作成します:File->新規->ファイル。この例では、
script.sh
になります。拡張子は「.sh」である必要があり、必須です。- ファイル
_DEBUG.sh
をプロジェクトフォルダにコピーします。次のテキストをファイル
script.sh
の先頭に挿入します。. _DEBUG.sh
ファイルがMicrosoft Windowsで作成されている場合は、必ずFile->変換行区切り文字->Unix。
デバッグ起動構成をセットアップします:Run->デバッグ設定->Bashスクリプト...2つありますここで設定するフィールド:
a)「Bashスクリプト:」-デバッグするBashスクリプトへのEclipseのワークスペース内のパス。
e) "デバッガポート:" 33333デバッグパースペクティブに切り替えます。デバッグセッションを開始します。 bash Shellから
script.sh
を起動します。
このbashデバッガには、次のような標準プログラミングデバッガのすべての機能があります。
The Shelled(Shell Script Editor)IDE(Integrated Development Environment))には、コンテキストチェックを実行して強調表示するという追加のボーナスがありますスクリプトを正しくインデントしない場合、すぐに多くのエラーにフラグを付けたり、ローカル化したりできる可能性があります。
次に、その他IDEメリットなどがあります。
現在、VS Code Bash Debugがあります。
https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug
「ステップイン/アウト/オーバー」があり、各変数の値も表示されます。
素晴らしいリソースが近年登場しました: http://shellcheck.net
通常のbashよりも多く表示されるため、厄介な閉じられていない引用符や中括弧などを簡単に見つけることができます。
機密情報(ips、パスワードなど)をネット上に貼り付けないようにしてください(特にhttpであり、暗号化されていないため)(shellcheckもダウンロードできると思いますが、わかりません)
単に使用:
#!/bin/bash -x
シェルについても同じです:
#!/bin/sh -x