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

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を介して独自のログファイルに出力を書き込む。

コメント

  • -vも役立ちます(実行されるたびに各行を出力します)。 -xと組み合わせることができます)。また、次も参照してください: bashdb.sourceforge.net
  • もう1つのすばらしいリソースは次のとおりです: shellcheck .net
  • ” exec 5 > ” do?
  • @aggsol:BASH_XTRACEFD="5"を使用すると、bashはset -xファイル記述子 5を有効にします。exec 5> >(logger -t $0)は、出力をファイル記述子5からloggerコマンド。
  • PS4で行番号とシェルスクリプトのパスまたは名前を取得できるかどうか疑問に思っていますか?

回答

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"; 

このタイプの出力になります:

        ss1

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を組み合わせた環境を使用できます。

シェルの切り替え

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

注:これを変更するには、次の場所に移動します: Window -> 設定-> シェルスクリプト-> インタプリタ

セットアップ手順

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

  1. シェルスクリプトプロジェクトの作成: ファイル-> 新規-> その他– > シェルスクリプト

->シェルスクリプトプロジェクトウィザード

  • Bashスクリプトファイルを作成します: ファイル-> 新しい-> ファイル 。この例では、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

    「ステップイン/アウト/

    VSコードバッシュデバッグのスクリーンショット

    コメント

    • この回答は、適切なコンテキストでの質問に対応していません。 IDEが言及されていないためコマンドラインを想定

    回答

    単に使用:

    #!/bin/bash -x 

    シェルについても同じ:

    #!/bin/sh -x 

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です