ここに簡単な質問があります。*
(アスタリスクワイルドカード)は、グローバルスタイル文字(文字と数字)にのみ一致しますか?それとも特殊文字と一致しますか?
Bashでは*
すべての項目と一致しますが、cshでは*
英数字のみが一致します。
これに互換性のあるルールはありますか?誰でも明確にできますか?
答え1
*
すべての文字シーケンスに一致するファイル名パターン。
globとして使用されている場合(ファイル名の拡張/作成)、*
スラッシュ文字(まあ、現在のディレクトリのファイルリストのパターンが解決されます)または先行点と一致しません。
現在の定義は特徴時間の経過とともに変化しています。最近ではロケールによって定義や性格が変わります。今日、ほとんどのロケールはテキストにUTF-8エンコーディングを使用しています。つまり、文字は可変長バイトシーケンスです。たとえば、0x61は0xc3 0xa9a
です。é
UTF-8では、すべてのバイトシーケンスが有効な文字を構成するわけではありません。たとえば、0x61 0xc3 0x61 は無効です。 0x61は変換されますが、a
0xc3は文字に変換できません。
ほとんどのシェルでは、文字以外の*
文字も一致するため、ファイル名のバイトが現在のロケールで有効な文字を構成しているかどうかにかかわらず、名前が始まらない*
現在のディレクトリ内のすべてのファイルが拡張されます。.
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$
\303
csh
(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 複数の文字に一致するパターン
アスタリスク( '*')は、空の文字列を含むすべての文字列と一致する必要があるパターンです。
これは*
、すべての文字が無制限に一致することを意味します。