.*
の動作には.
と..
が含まれていますか?LSB、POSIX、またはその他の仕様で定義されていますか?
Single Unix Specification Version 2、volume” Commands&Utilities”、§2.13. からの引用:
ファイル名がピリオド(_
.
_)で始まる場合、パターンの最初の文字としてピリオドを使用するか、スラッシュ文字の直後にピリオドを使用して、ピリオドを明示的に一致させる必要があります。 (…)_[.abc]
_などの角かっこ式一致リストの明示的なピリオドがファイル名の先頭のピリオドと一致するかどうかは指定されていません。
_..
_の2番目のピリオド、または_.
_のワイルドカードと一致しない、_.*
_の唯一のピリオドに続く空の文字列を作成する例外はありません。したがって、標準では、_.*
_は_.
_および_..
_と一致しますが、煩わしいとされています。
上記の箇所では、シェルの動作について説明しています(sh
コマンド)。 glob
Cライブラリ関数のセクションでは、このパッセージを参照しています。
言語は バージョン でもまったく同じで、POSIX:2001およびIEEE 1003.1-2001とも呼ばれ、現在のほとんどのシステムで実装されています。
Dash、bash、およびksh93はPOSIXに準拠しています。 Pdkshとzsh(_emulate sh
_の下でも)はそうではありません。
Kshでは、FIGNORE='.?(.)'
を設定することで_.*
_に_.
_と_..
_をスキップさせることができますが、これには_*
_にドットファイルを含めるという副作用があります。または、_FIGNORE='.*'
_を設定できますが、_.*
_は何にも一致しません。
Bashでは、_.*
_を設定することで_.
_を_..
_と_GLOBIGNORE='.:..'
_をスキップさせることができますが、これには_*
_にドットファイルを含めるという副作用があります。または、_GLOBIGNORE='.*'
_を設定できますが、_.*
_は何にも一致しません。
おそらく、globignoreに関するbash拡張の機能を意味します。デフォルトでは、bash拡張は一致します。そして..しかし男を読んで:
The GLOBIGNORE Shell variable may be used to restrict the set of file names matching
a pattern. If GLOBIGNORE is set, each matching file name that also matches one of
the patterns in GLOBIGNORE is removed from the list of matches. The file names ``.''
and ``..'' are always ignored when GLOBIGNORE is set and not null. However, setting
GLOBIGNORE to a non-null value has the effect of enabling the dotglob Shell option,
so all other file names beginning with a ``.'' will match. To get the old behavior
of ignoring file names beginning with a ``.'', make ``.*'' one of the patterns in
GLOBIGNORE. The dotglob option is disabled when GLOBIGNORE is unset.
変数GLOBIGNORE=.:..
を設定できるので、次のように傾けると次のようになります。
rm -r * .*
現在のディレクトリのみを削除します。 POSIX標準では、それのみが指定されています。は現在のディレクトリであり、..は現在のディレクトリの親です。 。*の特別な意味は、bashまたは他のシェル(またはgrepなどのプログラム)によって解釈されます。
私の知る限り、LSB4.1はbash
を必要とせず、sh
のみを必要とします。
sh
POSIXに続く (1つのマイナーな無関係な拡張子付き)の場合。
Linuxのマニュアルページ はPOSIX.2、3.13を参照しています。