コマンド処理の各ステップを表示する方法はありますか?

コマンド処理の各ステップを表示する方法はありますか?

set -xコマンドの最終結果のみが表示されます。下の画像のように、各ステップをより明確に見る方法はありませんか?

ここに画像の説明を入力してください。

答え1

見つかったトークンと実際のコマンドの実行中に実行されたアクションを出力するシェル構文スキャナとパーサーが必要なようです。

処理速度が非常に遅くなり、少し複雑なコマンドごとに多くの出力が生成されるため、これを行うシェルについてはわかりません。

bash定義されたマクロを使用してシェルを直接コンパイルした場合に使用DEBUGそしてitrace()シェルソースコード1でこの関数のコメント付き呼び出しをすべて有効にすると、必要なもののいくつかを取得できます。

bash-4.4$ if [[ "$BASHPID" = 10 ]] && [[ "$USER" = myself ]]; then echo hello me; fi
TRACE: pid 22914: parse_matched_pair[9]: open = " close = " flags = 0
TRACE: pid 22914: parse_matched_pair[9]: returning $BASHPID"
TRACE: pid 22914: parse_matched_pair[9]: open = " close = " flags = 0
TRACE: pid 22914: parse_matched_pair[9]: returning $USER"
TRACE: pid 22914: param_expand: `$BASHPID' pflags = 0

ここでは、開く二重引用符と、閉じる二重引用符とシェル変数の検索方法に関するいくつかのデバッグステートメントを出力するパーサーを表示できます。その後、別の処理ステップは実行されたパラメータ拡張を通知しますが、すべての$BASHPIDステップをリストするわけではありません。

このタイプのデバッグ出力は、bash実際にはシェルのソースコードの作成と変更に関わる人々にとってより有用であり、シェルが入力を解析して解釈する方法を理解するのには確かに便利です。

シェルの構文と構文がどのように機能するかを理解するには、次のように始めることをお勧めします。シェル構文のPOSIX定義(これは非常に複雑で、読めない人にとってはほとんど意味がありません。EBNF)。


1文法的エラーがある場合は除外されます。lib/glob/glob.c

答え2

set -xバイナリではなく bash シェルスクリプトに適用されます。

バイナリ実行を追跡するには、デバッガの使用を考慮する必要があります(例gdb:)

関連情報