ワイルドカードの「*」(アスタリスク)は、文字(例えばazや0-9)にのみ一致しますか?

ワイルドカードの「*」(アスタリスク)は、文字(例えばazや0-9)にのみ一致しますか?

ここに簡単な質問があります。*(アスタリスクワイルドカード)は、グローバルスタイル文字(文字と数字)にのみ一致しますか?それとも特殊文字と一致しますか?

Bashでは*すべての項目と一致しますが、cshでは*英数字のみが一致します。

これに互換性のあるルールはありますか?誰でも明確にできますか?

答え1

*すべての文字シーケンスに一致するファイル名パターン。

globとして使用されている場合(ファイル名の拡張/作成)、*スラッシュ文字(まあ、現在のディレクトリのファイルリストのパターンが解決されます)または先行点と一致しません。

現在の定義は特徴時間の経過とともに変化しています。最近ではロケールによって定義や性格が変わります。今日、ほとんどのロケールはテキストにUTF-8エンコーディングを使用しています。つまり、文字は可変長バイトシーケンスです。たとえば、0x61は0xc3 0xa9aです。éUTF-8では、すべてのバイトシーケンスが有効な文字を構成するわけではありません。たとえば、0x61 0xc3 0x61 は無効です。 0x61は変換されますが、a0xc3は文字に変換できません。

ほとんどのシェルでは、文字以外の*文字も一致するため、ファイル名のバイトが現在のロケールで有効な文字を構成しているかどうかにかかわらず、名前が始まらない*現在のディレクトリ内のすべてのファイルが拡張されます。.1つの例外は、少なくとも私のDebianシステムで見つかったcsh-20110502(それ自体はOpenBSDのcshベース)のようです。

$ touch "$(printf '\xc3')" "$(printf '\xc3\xa9')"
$ ls
?  é
$ locale charmap
UTF-8
$ bash -c 'echo *' | sed -n l
\303 \303\251$
$ csh -c 'echo *' | sed -n l
\303\251$

\303csh(0xc3バイト表現)は有効な文字ではないため、出力で失われます。

$ LC_ALL=C csh -c 'echo *' | sed -n l
\303 \303\251$

Cロケールでは文字がバイトにマッピングされるため(0x7f以上の値を持つ文字は定義されていません)、0xc3は1文字、0xc3 0xa9は2文字です。

cshそれにもかかわらず、Debianで使用する理由はありません。tcshシェルのようなものが必要な場合はそれを使用しますが、完全にcsh避けるのが最善ですcsh

答え2

Open Group 基本仕様 6号 IEEE Std 1003.1 部分から2.13.2 複数の文字に一致するパターン

アスタリスク( '*')は、空の文字列を含むすべての文字列と一致する必要があるパターンです。

これは*、すべての文字が無制限に一致することを意味します。

関連情報