パラメータの解析と拡張を追跡するには?

パラメータの解析と拡張を追跡するには?

zsh以下の例は、私がスクリプトを「日常的なWTF」と考えていることを示しています。私はzshこれらの混乱したケースを自分で解決するのに十分な量のルールをよく理解したいと思っていますが、それを理解するのに役立ついくつかの設定、スキル、ツール、またはヒントを探したいと思います。 。少なくとも何が起こったのかを分析するのに役立ちます。いくつかのコードを段階的に実行したり、実行トレースをチェックするためにデバッガを使用するのと本質的に似ています。


私はこれが現在の環境で定義されていない識別子の${(%):-%x}かわいい略語だと思います。実際、次が本当のようです。${(%)NONEXISTENT:-%x}NONEXISTENT

# /tmp/test
echo "${(%)NONEXISTENT:-%x}"
echo "${(%):-%x}"

結果:

% zsh /tmp/test
/tmp/test
/tmp/test

だから同じトークンで、私はそれが${(%)-%x}ただのかわいい略称だと思います${(%)NONEXISTENT-%x}

今ごろ予想していたのですが、私が間違っていました。これは、以前に表示されたスクリプトを数行に拡張してからスクリプトに表示されます。

# /tmp/test
echo "${(%)NONEXISTENT:-%x}"
echo "${(%):-%x}"
echo "${(%)NONEXISTENT-%x}"
echo "${(%)-%x}"

結果:

% zsh /tmp/test
/tmp/test
/tmp/test
/tmp/test
569X

もちろん、詳細はスクリプトが実行されるか、スクリプトのソースによって異なります。

% source /tmp/test
/tmp/test
/tmp/test
/tmp/test
5679BJTVXgim

答え1

zsh文書にルールセクションパラメータ拡張を適用する方法について説明します。シェルが何をするかを調べるためにそれを守ることができます(私が知っているデバッガはこれをすることはできません)。


あなたが考えるのは正しいですが、正式にはそうではありません${(%)-%x}$-シェル特殊変数、これはシェルオプションに拡張されます。

したがって、シェルは結果${(%)-%x}%フラグを適用し、末尾の$-リテラル文字を削除します。x

関連情報