スクリプトをデバッグモードで実行する 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 スクリプトを実行すると、次の出力が生成されます。
ローカルデバッグ set コマンドを使用してローカル デバッグ ブロックを構築できます。次のようにローカル デバッグを追加できます。 -x を設定する 日付 +x を設定 > bash script1.sh # デバッグパラメータを追加する必要はありません。スクリプトが起動します。 + 日付 2020年2月28日金曜日午後6時23分04秒CST +セット+x これは文字列です:黒 そしてこれは数字です: 9 デバッグパラメータテーブル
デバッグに使用されるパラメータは、操作中に動的に追加または削除できます。 > -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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: JavaScript における async と await の使い方とメソッド
>>: MySQL 8.0.18はデータベースにユーザーを追加し、権限を付与します
関連記事: CentOS7でyumを使用してDockerをインストールするDockerを使ってWin...
目次テーブルの目的例えばテーブル分割戦略すでにオンラインになっている実行中のテーブルはどうすればよい...
重要な注意: この記事を読む前に、Docker コンテナに関する知識と、一般的な Docker 操作...
まず、Navicat for MySQL をダウンロードしてインストールする必要があります。正規版の...
1. 通常の背景ぼかしコード: <スタイル> html, 体 { 幅: 100%; 高...
この記事では、WeChatアプレットの計算機機能を実装するための具体的なコードを参考までに紹介します...
/****************** * 高度な文字デバイス ドライバー ***********...
目次1. MySQL msiバージョンをダウンロードする2. インストール3. 環境変数を設定する1...
この記事を読む前に、ボリューム、バインドマウント、tmpfs マウントの基本を理解しておいてください...
序文:年末です。データベースを検査する時期ではないでしょうか?一般的に、検査では、パスワードの複雑さ...
MySQL では、REVOKE ステートメントを使用してユーザーの特定の権限を削除できます (ユーザ...
Web ページのパフォーマンスを向上させるにはどうすればよいでしょうか?ほとんどの開発者は、Java...
ElementUIページングコンポーネントPagination in Vueの使用は参考になります。...
JavaScript に依存せず、純粋な CSS を使用してsvgストローク描画アニメーション効果と...
毎日サービスをチェックしているときに、portainer からコンテナ ログを確認しようとしたところ...