bashの一部のスクリプトで、エラーや予期しない動作について問題が発生しています。問題の原因を調査して、適用できるようにしたいと思います。修正。bashの「デバッグモード」を切り替えて詳細情報を取得する方法はありますか?
回答
bash -x ./script.sh
でbashスクリプトを開始するか、スクリプトset -x
を追加して、デバッグ出力を確認します。
bash
4.1以降で追加:
デバッグ出力を別のファイルに書き込む場合は、これをスクリプトに追加します:
exec 5> debug_output.txt BASH_XTRACEFD="5"
参照: https://stackoverflow.com/a/25593226/3776858
行番号を表示する場合は、次を追加します。
PS4="$LINENO: "
コマンドを使用すると、これを使用して、タイムスタンプ、スクリプト名、行番号を使用して、syslogを介してデバッグ出力を書き込むことができます。
#!/bin/bash exec 5> >(logger -t $0) BASH_XTRACEFD="5" PS4="$LINENO: " set -x # Place your code here
logger
コマンドのオプション-p
を使用して、個々の施設とレベルを設定できますローカルsyslogを介して独自のログファイルに出力を書き込む。
コメント
回答
set -x
の使用私は常にset -x
と。何が起こっているのかを確認したい領域をラップして、冗長性を上下させることができます。
#!/bin/bash set -x ..code to debug... set +x
log4bash
また開発作業を行い、log4j、log4perlなどの名前で呼ばれるロガーのスタイルに精通している場合は、 log4bash を利用することをお勧めします。 a>。
抜粋
それに直面しましょう-プレーンな古いエコーはそれをカットしません。 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
、ここで入手可能:
コメント
- Ubuntuでは、.bashrcに
alias say="spd-say"
があります。これはsay
コマンド。 - set-vxは、trap –trap read debugと組み合わせて使用すると適切な組み合わせになります。これにより、行ごとにステップオーバーして、結果を見る
回答
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と同様に、ステートメントは実行される直前に 表示されます。したがって、変数を調べて、ステートメントが実行する前に何を実行するかを確認できます。
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
OK、動作します。 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
回答
ほとんどのBourneベースのシェルでスクリプトをデバッグするための標準的な方法bashは、スクリプトの先頭にset -x
を書き込むことです。これにより、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
上記では、一重引用符が原因で検索が失敗する理由がわかります。
機能を無効にするには、set +x
と入力します。
回答
Eclipseの使用
以下にリンクされている「_DEBUG.sh」スクリプトを使用して、EclipseとShelledを組み合わせた環境を使用できます。
- Eclipse Shelled Plug-in:
http://sourceforge.net/projects/shelled/files/shelled/update/ - bashデバッガー-シェルでのみ機能します:
http://sourceforge.net/projects/basheclipse/
シェルの切り替え
Byデフォルトでは、シェル開発ツールはインタープリターとして/bin/dash
を使用します。これを/bin/bash
に変更して、Webおよび私の環境のほとんどのシェルサンプルとの互換性を高めました。
注:これを変更するには、次の場所に移動します: Window -> 設定-> シェルスクリプト-> インタプリタ
セットアップ手順
デバッガパッケージには、スクリプトのデバッグに_DEBUG.sh
スクリプトを使用するための手順が含まれています。これは基本的に(readme.txt)です。
- シェルスクリプトプロジェクトの作成: ファイル-> 新規-> その他– > シェルスクリプト
->シェルスクリプトプロジェクトウィザード 。
script.sh
になります。拡張子は「.sh」である必要があり、必須です。_DEBUG.sh
をプロジェクトフォルダーにコピーします。を挿入します。ファイルの先頭に次のテキストscript.sh
:
. _DEBUG.sh
ファイルの場合がMicrosoftWindowsで作成されたら、必ず ファイル-> 行区切り文字を-> Unix に変換します。
デバッグ起動構成を設定します: Run -> デバッグ構成-> バッシュスクリプト… ここで設定するフィールドは2つあります。
a)「Bashスクリプト:」-EclipseのワークスペースでデバッグするBashスクリプトへのパス。
e)「デバッグポート:」33333
デバッグパースペクティブに切り替えます。デバッグセッションを開始します。 bashシェルからscript.sh
を起動します。
bashデバッグUI
このbashデバッガーには、次のような標準のプログラミングデバッガーの全機能があります。
- ブレークポイントトグル
- 単一のステップバイステップ操作
- ステップイン、ステップアウト、ステップオーバー関数とサブルーチン
- スクリプトの実行中の任意の時点でコードまたは変数を調べる
Shelled (シェルスクリプトエディター)IDE(統合開発環境)には、スクリプトの作成中にコンテキストチェック、強調表示、およびインデントを実行するという追加のボーナスがあります。正しくインデントされない場合は、すぐに多くのエラーにフラグを付けてローカル化できる可能性があります。
次に、その他のIDEの利点がありますなど:
- TODOタスクリスト
- Mylynタスク
- ブックマークリスト
- 複数ウィンドウ編集
- 環境のリモート共有
コメント
- クールなヒント。Bashができることを知ってうれしいです。このようにデバッグされます。
回答
近年、すばらしいリソースが登場しました: http://shellcheck.net
通常のbashよりも多くの情報が表示されるため、厄介な閉じられていない引用符や巻き毛を簡単に見つけることができます。括弧など。
機密情報(ips、パスワードなど)をネット上に貼り付けないように注意してください…(特にhttpであり、暗号化されていないため)(シェルチェックも利用できると思います)ダウンロードするが、わからない)
回答
現在、VS CodeBashデバッグがあります。
https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug
「ステップイン/アウト/
コメント
- この回答は、適切なコンテキストでの質問に対応していません。 IDEが言及されていないためコマンドラインを想定
回答
単に使用:
#!/bin/bash -x
シェルについても同じ:
#!/bin/sh -x
BASH_XTRACEFD="5"
を使用すると、bashはset -x
がファイル記述子 5を有効にします。exec 5> >(logger -t $0)
は、出力をファイル記述子5からlogger
コマンド。