エラーと予期しない動作に関連する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";
次の種類の出力を生成します。
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の組み合わせ環境を使用できます。
- Eclipseシェルプラグイン:
http://sourceforge.net/projects/shelled/files/shelled/update/ - bash デバッガ - シェルのみ:
http://sourceforge.net/projects/basheclipse/
スイッチシェル
デフォルトでは、Shelled開発ツールは/bin/dash
インタプリタとして使用されます。/bin/bash
Webと私の環境のほとんどのシェルの例との互換性が向上するように変更しました。
メモ:次の方法でこの設定を変更できます。窓->好み->シェルスクリプト->通訳
設定手順
デバッガパッケージには、デフォルト_DEBUG.sh
でscriptsを使用してスクリプトをデバッグするための手順が含まれています(readme.txt)。
- シェルスクリプトプロジェクトを作成します。 文書->新しい->その他->シェルスクリプト->シェルスクリプトプロジェクトウィザード。
- Bashスクリプトファイルを作成します。文書->新しい->文書。この例では、
script.sh
拡張子は「.sh」でなければならず、必須です。- ファイルを
_DEBUG.sh
プロジェクトフォルダにコピーします。ファイルの上部に次のテキストを挿入します
script.sh
。. _DEBUG.sh
ファイルがMicrosoft Windowsで作成されている場合は、必ず以下を実行してください。文書->行区切り文字を次に変換->Unix。
デバッグ開始構成を設定します。走る->デバッグ構成->バッシュスクリプト...設定する必要があるフィールドは2つです。
a) "Bash スクリプト:" - デバッグする Bash スクリプトへの Eclipse ワークスペースへのパスです。
e) 「デバッガポート:」 33333「デバッグ」の視点に切り替えます。デバッグセッションを開始します。
script.sh
bash シェルで実行します。
Bash デバッグユーザーインターフェイス
バッシュデバッガ次の標準プログラミングデバッガのすべての機能を備えています。
- ブレークポイントの切り替え
- シングルステップ操作
- 関数とサブルーチンを段階的に実行、段階的に実行
- スクリプトの実行中はいつでもコードまたは変数を確認してください。
皮をむいた(シェルスクリプトエディタ)統合開発環境(IDE)には、スクリプトの作成中にコンテキストの確認、ハイライト、インデントを実行するという利点があります。インデントが正しくない場合は、すぐに多くのバグを表示/ローカライズできます。
そしてそこにその他のIDEの利点たとえば、
- TODOタスクリスト
- マイリンミッション
- ブックマーク一覧
- マルチウィンドウ編集
- リモート共有環境