「リストコンテキスト」(および「文字列コンテキスト」)は(正確に)何ですか?

「リストコンテキスト」(および「文字列コンテキスト」)は(正確に)何ですか?

私は「リストコンテキスト」と「文字列コンテキスト」が何度も使用されているのを見ました。

私はPerlでそのような説明の使用を知って理解しています。それら$と@に適用されます。

ただし、シェルの説明に使用される場合:


これは、どこにも定義されていないか、せいぜいよく文書化されていない分散用語であるようです。

POSIX にはその定義はありません。Googleによると

これは(したがって、)そのポイントは何ですか? :

つまり、単語のリストやパターンが必要な場合は必ず二重引用符が必要です。パーサーが生の文字列を必要とする状況ではオプションです。

しかし、この用語は使いにくいようです。文字列コンテキストであるかリストコンテキストであるかを確認するために、「結果が必要」のときに「結果が何であるべきか」をどのように見つけることができますか?

それとも正確かつ正確に定義できますか?

ベストアンサー1

標準シェル言語にはそのような概念はありません。 「コンテキスト」はなく、単にステップを拡張するだけです。

引用符は、生成された単語のトークン化で最初に認識されます。彼らは単語を互いに貼り付けてabc"spaces here"xyz「単語」を形成します。

理解すべき重要な点は、引用文が後続の拡張段階で保存され、元の引用文が拡張に表示される可能性のある引用文とは区別されることです。

パラメータ拡張では二重引用符は考慮されません。ただし、フィールド分割プロセスは後で発生し、これは最初のトークン化に再び続きます。引用符は再分割を防ぎ、再び保持されます。

この分割後、パス名拡張(「globbing」)が発生します。保持された引用符はこれを防ぎます。ワイルドカード演算子は引用符内で認識されません。

最後に、「引用符の削除」という後のステップで引用符が削除されます。もちろん、ただオリジナル引用符!

POSIXはうまくいく導入プロセス理解できる方法で、関係のない概念(誤解を招く)で謎を解こうとすると理解が混乱するだけです。

ゴミを捨てる人アドホック「リストコンテキスト」などの概念は、すべての処理に対して同等の(同じ結果を生成する)完全な代替仕様を提供できるようにアイデアを定式化する必要があります。その後、並列設計間で概念を混在させないでください。 1つの解釈を使用してください。 「リストコンテキスト」または「文字列コンテキスト」は、これらの概念が明確に定義され、処理ステップがそれを中心に構成されるシェル拡張理論では意味があります。

推測すると、「リストコンテキスト」は、シェルがトークン化された単語リスト(2つの単語リストなど)を処理するというアイデアを表します{foo} {abc" x "def}。引用符は2番目の単語の一部ではありません。その内容は、実際にはabc x defスペースの分割を防ぐ意味論的な引用符です。この引用符の中には「文字列コンテキスト」があります。

しかし、これらの拡張ステップを実装することは不可能です。実際に生の引用として識別される引用もありますが、一種のリストデータ構造、つまり引用された部分{foo} {abc" x "def}が他のタイプのノードによって識別される(そして引用が消える)リストのリストです。 Lisp 表記法を使用すると、次のようになります。

(("foo") ;; one-element word
 ("abc" (:dq-str " x ") "def")) ;; three-element word

:dq-strラベルのないノードは、二重引用符で囲まれた領域であるリテラルテキストです。:sq-str単一の参照項目には異なる種類を使用できます。

拡張はこの構造を繰り返し、:dq-str文字列オブジェクト、式、またはその他の項目を見ているかどうかに応じてさまざまな操作を実行できます。:dq-strまたは、ファイル拡張子とフィールド分割が抑制されます:sq-str。しかし、パラメータ拡張する内で発生します:dq-str。 「参照の削除」は、フラグメントを取得し、文字列を連結し、内部リスト構造を平面化し、型インジケータを失う最終パスに対応し、結果は次のとおりです。

("foo"
 "abc x def") ;; plain string list, usable as command arguments

2番目のアイテムは、最初のアイテム("abc" (:dq-str " x ") "def")と最後のアイテムが拡張されています。その項目はリストの直接要素なので、「リストコンテキスト」にあると言えます。そして、中間の内容は式、つまり「(二重引用符)文字列コンテキスト」" x "でラップされます。:dq-str

「リストコンテキスト」で「リスト」が意味するのは、このように明確に定義されたモデルがなければ誰でも推測できることです。主な単語リストですか?それとも単語を表す塊のリストですか?

おすすめ記事