答え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
:)