パス名拡張解凍とecho 'a'から引用符を削除*

パス名拡張解凍とecho 'a'から引用符を削除*

シェルは次のとおりです。GNU bash、バージョン5.1.16(1)-リリース(x86_64-pc-linux-gnu)

現在、作業ディレクトリには2つのファイルがあります。

  • 名前の人abc.txt
  • 'a'bc.txttouch \'a\'bc.txt名前付きファイル(次を使用して作成)

次のコマンドを実行します。

echo 'a'*

出力は次のとおりです

abc.txt

GNU bash マニュアルは、パス名拡張後に引用符の削除が処理されることを指定します。

したがって、このコマンドは一致すると予想しましたが、'a'bc.txt一致しませんでしたabc.txt。 !

上記のコマンドは次のように進行すると予想されます。

  • パス名拡張フェーズでは、ファイル名が'a''a'リテラル文字列で)で始まり、一致するすべてのファイルと一致しようとします。'a'bc.txt
  • '引用符の削除ステップでは、'a' 前のステップで発生したパス名拡張の結果に影響を与えずにinの一重引用符が削除されます。

明らかにここに私が理解していない何かがあります。

この特定の質問に関する文書や回答が見つかりません。

答え1

説明する方法によると、一致は不可能です *。現在の方法は、最初のアスタリスクが引用された場所を書くことができるので、リテラルであり、2番目のアスタリスクは'*'*何でも一致するという特別な意味を維持することです。引用符(および対称バックスラッシュ)自体がファイル名で一致する文字を見つける必要がある場合、これは不可能です。


シェルの内部実装がどのように機能するか、または「引用符の削除」というフレーズの後に記録が何であるかはわかりませんが、引用符付き文字の(隠された)属性の状態について考える方が良いことがわかりました。コマンドラインが最初に処理された後は、引用符文字が実際に別のエンティティとして存在すると思います。

したがって、を書くとき(少なくともほとんど見えないことを願っていますが)、太字で文字が引用されているように表示されます'*'***その後、リテラル引用符と一致させるには、引用符を引用またはエスケープする必要があります。たとえば、つまり、quote-asterisk-quoteと通常特別なアスタリスクが"'*'"*あります。'*'*(一部の初期シェル実装では、バイトの8番目のビットを使用して引用符を表示したと聞きましたが、もちろんこれは7ビット文字セットでのみ機能します。)

または、必要に応じて引用符を特殊文字として扱います。これは、ターゲット文字列の文字と一致するのではなく、他の文字が引用符で囲まれているかどうかを確認するためにのみ使用されます。

関連情報