bash のスクリプトデバッグメカニズムの詳細な説明

bash のスクリプトデバッグメカニズムの詳細な説明

スクリプトをデバッグモードで実行する

bash -x <script> を使用すると、スクリプト全体をデバッグ モードで実行できます。Bash は実行前に各コマンド ラインを出力し、各行の先頭にはコマンドのネストされたレベルの数を示す + 記号が付きます。

> bash -x デバッグ.sh 
+ echo '最初の行'
最初の行 # 出力にはプラス記号がありません ++ date # コマンドは echo + echo 'Print datetime: Thu 26 Mar 2020 08:21:28 PM CST Done.' にネストされているため、最初にコマンドが実行され、2 つのプラス記号が置き換えられます。
印刷日時: 2020 年 3 月 26 日 (木) 午後 8 時 21 分 28 秒 CST 完了。

スクリプトが複雑な場合は、デバッグ用の組み込み変数とともに環境変数 PS4 を使用して、より詳細な情報を出力できます。

> エクスポート PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
> bash -x デバッグ.sh 
+debug.sh:3:: echo '最初の行'
最初の行
++debug.sh:4:: 日付
+debug.sh:4:: echo '日時を印刷: 2020 年 3 月 26 日 (木) 午後 8 時 35 分 59 秒 CST 完了。'
印刷日時: 2020 年 3 月 26 日 (木) 午後 8 時 35 分 59 秒 CST 完了。

また、trap の DEBUG キーワードを使用して、スクリプトの各行を解釈する前に、指定されたコマンドまたは関数を実行することもできます。

トラップ 'echo "VARIABLE-TRACE> \$variable = \"$variable\""' デバッグ
変数=29
変数++を使う
変数*=5とする
終了 0

# 出力は次のようになります VARIABLE-TRACE> $variable = ""
変数トレース> $variable = "29"
変数トレース> $variable = "30"
変数トレース> $variable = "150"

また、trap ERR キーワードを使用して、解釈中にエラーが発生したときに、エラー コマンドを出力するなどの事前設定されたアクションを実行することもできます。

トラップ 'echo $BASH_COMMAND' ERR

ただし、trap を使用したデバッグの効率が低いため、より複雑なスクリプトではデバッグ オプションを直接使用するか、bashdb などのデバッグ ツールを使用することをお勧めします。

高度なデバッグ

関数呼び出し情報を表示する

関数内で組み込みコマンド呼び出し元を使用すると、関数の呼び出し情報を stdout に出力できますが、コマンドは関数内で呼び出す必要があることに注意してください。

#!/usr/bin/bash

関数1() {
  i が `seq 0 3` の場合
  する
    echo -e "レベル$i\t `呼び出し元$i`"
  終わり
}

関数2() {
  関数1
}

関数3() {
  関数2
}

関数3
caller 0 # 関数内で呼び出される必要があります。そうでない場合は出力はありません exit 0

スクリプトを実行すると、次の出力が生成されます。

Level0 11 func2 call.sh # func1の直接呼び出し元
Level1 15 func3 call.sh # 間接呼び出しの1レベル
Level2 18 main call.sh # 第2レベルの間接呼び出し
レベル3 # 3番目のレベルの呼び出しがないため出力なし

ローカルデバッグ

set コマンドを使用してローカル デバッグ ブロックを構築できます。次のようにローカル デバッグを追加できます。

-x を設定する
日付
+x を設定
> bash script1.sh # デバッグパラメータを追加する必要はありません。スクリプトが起動します。

+ 日付
2020年2月28日金曜日午後6時23分04秒CST
+セット+x

これは文字列です:黒
そしてこれは数字です: 9

デバッグパラメータテーブル

短いコマンド長いコマンド効果
-f を設定する-o noglob を設定しますファイル名のメタ文字マッチングを無効にする
-v を設定する-o 詳細設定入力したコマンドを印刷する
-x を設定する-o xtrace を設定するコマンドラインの先頭には + が出力され、エラーが発生した場合は詳細情報が出力されます。

デバッグに使用されるパラメータは、操作中に動的に追加または削除できます。

> -v を設定する
> 日付
日付 
2020年2月28日金曜日午後6時54分47秒CST
> set -x # パラメータは累積できます。date # -v の効果 + date # -x の効果Fri 28 Feb 2020 06:55:37 PM CST
> set +vx # パラメータをキャンセル set +vx

-f オプションを使用すると、スクリプト内のエスケープ文字の数を大幅に減らすことができます。

> ?
x86_64-pc-linux-gnu-ライブラリ
> set -f # メタ文字のマッチングを無効にする > ls ?
ls: '?' にアクセスできません: そのようなファイルまたはディレクトリはありません
> タッチ?
> ?
'?'
> rm ?
> set +f -x # オプション x は詳細なエラー情報を表示するためにも使用できます > aaa
+ああ
+ '[' -x /usr/lib/コマンドが見つかりません ']'
+ /usr/lib/コマンドが見つかりません --aaa

コマンド 'aaa' が見つかりません。次の意味ですか:

 deb aha からのコマンド「aha」(0.5-1)
 deb jaaa (0.8.4-4) からのコマンド 'jaaa'
 deb astronomical-almanac (5.6-6) のコマンド 'aa'

試してください: sudo apt install <deb 名>

+ 戻る 127

デフォルトのデバッグ

スクリプトの最初の行にパラメータを直接追加して、スクリプトをデフォルトでデバッグ モードで開始することもできます。

#!/bin/bash -xv

失敗する可能性のあるコマンドの前に echo を使用してデバッグ情報を出力することもできます。

echo "デバッグ メッセージ: w コマンドを開始しようとしています"; w # 実行するコマンドを並べ替えるには、; を使用します echo "変数 VARNAME は現在 $VARNAME に設定されています。"

デバッグを支援するオプションの設定

デバッグを容易にするために、set コマンドを使用して bash オプションを設定できます。

> set -o # すべてのオプションのスイッチステータスを表示します > set -o | grep xtrace
xtrace オフ
> set -x # set -o xtrace と同等
> set -o | grep xtrace 
+ grep --color=auto xtrace
+ セット -o
xtraceオン
> set +x # set +o xtrace と同等
+セット+x
> set -o | grep xtrace
xtrace オフ

一般的なデバッグオプション

定義された変数を参照するとエラーが発生します:

> $VARの設定を解除し、$VARをエコーする

> set -u # set -o nounsetと同等
> $varをエコーする
bash: var: バインドされていない変数

ファイル内のデータが誤って上書きされるのを防ぐには、既存のファイルへのリダイレクトを禁止するように設定します。

> set -C # set -o noclobber と同等
> タッチテスト
> 日付 > テスト
bash: テスト: 既存のファイルを上書きできません

ワイルドカードを解決しないように設定:

> set -f # set -o noglobと同等
> タッチ*
> ll *
-rw-rw-r-- 1 レミリア レミリア 0 3月 1 20:09 '*'

これで、bash のスクリプト デバッグ メカニズムの詳細な説明は終了です。より関連性の高い bash スクリプト デバッグ コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • バッチスクリプトを使用して特定のディレクトリで Git-Bash ウィンドウを起動する
  • シェル スクリプト (bash スクリプト) でスペースを含む変数を処理する
  • Bashスクリプトを使用すると、シェルにログインするたびにLinuxシステム情報を表示できます。
  • Bash スクリプトを使用して Linux のメモリ使用量を監視する方法
  • bash スクリプトで ssh/scp コマンドにパスワードを渡す方法の詳細な説明
  • Linux Bash スクリプトを使用してユーザーを識別する方法の例
  • シェルスクリプト実行におけるsource、sh、bash、./の違いの詳細な説明
  • Linux bash スクリプト監視、WebLogic サービスの開始と停止、スクリプトの記述
  • 安全で完全に機能する Bash スクリプトの書き方

<<:  JavaScript における async と await の使い方とメソッド

>>:  MySQL 8.0.18はデータベースにユーザーを追加し、権限を付与します

推薦する

MySQL データベースの集計クエリと結合クエリ操作

目次1. クエリ結果を挿入する2. 集計クエリ2.1 はじめに2.2 集計関数2.3 group b...

docker を使用して kafka プロジェクトをデプロイする Centos6 方法の分析

この記事では、Docker を使用して Centos6 に Kafka プロジェクトをデプロイする方...

JavaScript 配列と非配列オブジェクトのディープ クローンとシャロー クローンの原則の詳細な説明

目次シャロークローニングとディープクローニングとは何ですか? 1. アレイのクローンを作成する1.1...

MySQLでANDとORを組み合わせる問題を解決する

以下のように表示されます。 SELECT prod_name,prod_price FROM pro...

JS関数のカリー化の詳細な説明

目次1. 補足知識ポイント: 関数の暗黙的な変換2. 補足知識: call/apply を使って配列...

Linux lessコマンド例の詳細な説明

ファイル名が少ないファイルを表示ファイル名を少なく | grep -n コンテンツを検索内容に応じて...

Linux の総合システム監視ツール dstat の詳細な例

オールラウンドなシステム監視ツール dstat dstat は、vmstat、iostat、nets...

Echarts は 1 つのグラフ内で異なる X 軸を切り替える機能を実装します (サンプル コード)

レンダリング下の画像のような効果を実現したい場合は、読み続けてアニメーション画像に直接進んでください...

CSS3 で背景の透明化と不透明テキストを実装するサンプルコード

最近、画像上に半透明の背景でテキストを表示する必要があるという要件に遭遇しました。その効果は次のよう...

iOS スタイルの選択ボックスの開閉機能を実装するための純粋な CSS

1 効果デモアドレス: https://www.albertyy.com/2020/7/check...

vue3.0プロジェクトアーキテクチャを段階的に構築する方法を教えます

目次序文: 1. vue-cliでプロジェクトを作成する2. ルーターをインストールする3. ディレ...

Linuxでホスト名を変更する方法

1. 現在のホスト名を表示する [root@fangjian ~]# ホスト名ctl 静的ホスト名:...

VueはTodoListの例をカプセル化し、ブラウザのローカルキャッシュのアプリケーションを実装します。

この記事では主に、Vue で TodoList をカプセル化するケースと、ブラウザのローカル キャッ...

JavaScript の寄生的構成継承についての簡単な説明

コンポジション継承組み合わせ継承は、疑似古典的継承とも呼ばれます。これは、昨日説明したプロトタイプ ...

MySQLテーブル内の重複データをクエリする方法

hk_test(ユーザー名、パスワード) に値を挿入 ('qmf1', '...