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はデータベースにユーザーを追加し、権限を付与します

推薦する

CentOS7環境でDockerを使ってPHP動作環境を構築する手順を詳しく解説

関連記事: CentOS7でyumを使用してDockerをインストールするDockerを使ってWin...

MySQL テーブル分割後にスムーズにオンラインになる方法

目次テーブルの目的例えばテーブル分割戦略すでにオンラインになっている実行中のテーブルはどうすればよい...

Spring Boot のパッケージ化と Docker リポジトリへのアップロードの詳細な手順

重要な注意: この記事を読む前に、Docker コンテナに関する知識と、一般的な Docker 操作...

Navicat for MySQL チュートリアル

まず、Navicat for MySQL をダウンロードしてインストールする必要があります。正規版の...

CSS3 で背景ぼかしを実現する 3 つの方法 (要約)

1. 通常の背景ぼかしコード: <スタイル> html, 体 { 幅: 100%; 高...

WeChatアプレットがシンプルな計算機機能を実装

この記事では、WeChatアプレットの計算機機能を実装するための具体的なコードを参考までに紹介します...

Linux カーネル デバイス ドライバー 高度な文字デバイス ドライバーのメモ

/****************** * 高度な文字デバイス ドライバー ***********...

MySQL msiバージョンのダウンロードとインストールの初心者向けの詳細なグラフィックチュートリアル

目次1. MySQL msiバージョンをダウンロードする2. インストール3. 環境変数を設定する1...

Dockerデータストレージの概要

この記事を読む前に、ボリューム、バインドマウント、tmpfs マウントの基本を理解しておいてください...

年末ですが、MySQL パスワードは安全ですか?

序文:年末です。データベースを検査する時期ではないでしょうか?一般的に、検査では、パスワードの複雑さ...

MySQL REVOKE でユーザー権限を削除する

MySQL では、REVOKE ステートメントを使用してユーザーの特定の権限を削除できます (ユーザ...

高性能な HTML アプリケーションを作成するためのヒント

Web ページのパフォーマンスを向上させるにはどうすればよいでしょうか?ほとんどの開発者は、Java...

ElementUI ページネーション コンポーネントの使い方 Vue でのページネーション

ElementUIページングコンポーネントPagination in Vueの使用は参考になります。...

CSS3 を使用した SVG パス ストロークのアニメーション化入門チュートリアル

JavaScript に依存せず、純粋な CSS を使用してsvgストローク描画アニメーション効果と...

docker ログが取得できない問題の解決方法

毎日サービスをチェックしているときに、portainer からコンテナ ログを確認しようとしたところ...