Apakah perilaku. * Untuk disertakan. dan .. didefinisikan dalam LSB atau POSIX atau spesifikasi lainnya?


Jawaban:


10

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 ( shperintah). Bagian globfungsi 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.


Catatan: bashtidak selalu mematuhi POSIX. hanya ketika dipanggil sebagai sh.
strugee

4

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).



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.