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

8

Apakah perilaku .*untuk dimasukkan .dan ..didefinisikan dalam LSB atau POSIX atau spesifikasi lainnya?

lesmana
sumber

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.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
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).

lcipriani
sumber
0

The Linux man-halaman referensi POSIX.2, 3.13.

maxschlepzig
sumber
Apakah LSB mengharuskan man, man globatau halaman manual harus ada? Saya tidak dapat menemukan pria di sini (yang mengejutkan saya).
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
0

Sejauh yang saya tahu, LSB 4.1 tidak memerlukan bashdan hanya sh.

Untuk sh itu ikuti POSIX (dengan satu ekstensi minor yang tidak relevan).

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
sumber