Jawaban:
Mengutip dari spesifikasi Single Unix versi 2, volume ”Commands & Utilities", §2.13.3 :
Jika nama file dimulai dengan titik (
.
) periode harus dicocokkan secara eksplisit dengan menggunakan titik sebagai karakter pertama dari pola atau segera mengikuti karakter garis miring. (...) Tidak ditentukan apakah periode eksplisit dalam daftar pencocokan ekspresi braket, seperti[.abc]
dapat mencocokkan periode terkemuka dalam nama file.
Tidak ada pengecualian yang akan membuat periode kedua masuk ..
, atau string kosong mengikuti satu-satunya periode masuk .
, tidak cocok dengan wildcard .*
. Oleh karena itu standar mengatakan itu .*
cocok .
dan..
, meskipun mungkin mengganggu.
Bagian di atas menjelaskan perilaku shell ( sh
perintah). Bagian glob
fungsi pustaka C merujuk pada bagian ini.
Bahasanya persis sama dalam versi 3 , juga dikenal sebagai POSIX: 2001 dan IEEE 1003.1-2001, yang merupakan apa yang paling banyak diimplementasikan oleh sistem saat ini.
Dash, bash, dan ksh93 mematuhi POSIX. Pdksh dan zsh (bahkan di bawah emulate sh
) tidak.
Di ksh, Anda dapat membuat .*
lompatan .
dan ..
dengan pengaturan FIGNORE='.?(.)'
, tetapi ini memiliki efek samping dari pembuatan *
file titik sertakan. Atau Anda dapat mengatur FIGNORE='.*'
, tetapi kemudian .*
tidak cocok dengan apa pun.
Dalam bash, Anda dapat membuat .*
lompatan .
dan ..
dengan pengaturan GLOBIGNORE='.:..'
, tetapi ini memiliki efek samping dari pembuatan *
file titik sertakan. Atau Anda dapat mengatur GLOBIGNORE='.*'
, tetapi kemudian .*
tidak cocok dengan apa pun.
Mungkin maksud Anda fungsionalitas dalam perluasan bash tentang globignore. Secara default pencocokan ekspansi bash. dan .. tetapi membaca pria itu:
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.
Anda dapat mengatur variabel GLOBIGNORE=.:..
sehingga ketika Anda mengetikkan sesuatu seperti ini:
rm -r * .*
Anda hanya menghapus direktori saat ini. Standar POSIX hanya menentukan itu. adalah direktori saat ini dan .. di induk dari direktori saat ini. Arti khusus. * Ditafsirkan oleh bash atau shell lain (atau program seperti grep).
The Linux man-halaman referensi POSIX.2, 3.13.
man
, man glob
atau halaman manual harus ada? Saya tidak dapat menemukan pria di sini (yang mengejutkan saya).
Sejauh yang saya tahu, LSB 4.1 tidak memerlukan bash
dan hanya sh
.
Untuk sh
itu ikuti POSIX (dengan satu ekstensi minor yang tidak relevan).
bash
tidak selalu mematuhi POSIX. hanya ketika dipanggil sebagaish
.