Ini bekerja di bash:
touch a b c
echo !(a)
Jika saya menjalankan skrip di atas dalam zsh (dengan kshglob
on), komplain:
zsh: number expected
Jika saya tambahkan |
setelah a
, itu berfungsi:
echo !(a|)
Mengapa?
Karena dalam kasus ini, itu bertentangan dengan kualifikasi bola kosong karena sudah di akhir pola. *(a1)
diambil sebagai file yang terakhir diakses di hari terakhir. (a1)
diperlakukan sebagai kualifikasi glob. Jadi dalam !(a)
kasus Anda , zsh mengeluh tentang jumlah hari yang hilang setelah a
kualifikasi glob (di sini berlaku untuk file yang dipanggil !
).
Dalam zsh
gumpalan, (...)
pengelompokan sebagian besar digunakan untuk (foo|bar)
pergantian, jadi menambahkan a |
adalah cara yang terdokumentasi untuk memastikan trailing (...)
tidak diperlakukan sebagai kualifikasi glob.
Alternatif lain yang didokumentasikan adalah menggandakan kurung ( !((a))
) atau Anda dapat menambahkan kualifikasi glob kosong (seperti !(a)(-)
).
Untuk sepenuhnya menghilangkan ambiguitas itu, seseorang dapat mematikan bare_glob_qual
opsi ( set +o bareglobqual
), setelah itu kualifikasi glob harus ditulis dengan extendedglob
(#q...)
sintaks (di *(#qa1)
sini).
The kshglob
pilihan ( menambahkan pada tahun 1998 , sekitar waktu yang sama bash
menambahkan-nya extglob
pesta meskipun tidak memiliki gumpal diperpanjang sebelum itu) sebagian besar ada untuk ksh
modus emulasi ( emulate ksh
), untuk zsh
dapat menjalankan ksh
script, di mana kshglob
diaktifkan dan bareglobqual
dinonaktifkan. Ketika pertama kali diperkenalkan, setelah diaktifkan kshglob
, Anda harus menentukan kualifikasi glob -(...)
untuk menghindari konflik semacam itu tetapi itu menyebabkan terlalu banyak kebingungan dan bertentangan dengan @-(...)
sintaksis ksh93
, opsi (#q...)
dan bareglobqual
diperkenalkan kemudian.
zsh
pengguna umumnya lebih suka set -o extendedglob
operator extended glob ( ) milik zsh yang lebih mudah mengetik (untuk sebagian besar) dan lebih kuat (daripada yang diaktifkan dengan ksh88 kshglob
juga ditemukan di bash -O extglob
).
Misalnya !(foo)
akan ditulis ^foo
. Namun yang !(foo|)bar
setara akan lebih lama seperti (^(foo|))bar
.
Other ksh88 -> terjemahan zsh:
*(x)
-> x#
+(x)
-> x##
@(x|y)
-> x|y
?(x)
-> (x|)
Beberapa terjemahan ksh93 -> zsh:
~(i:x)
-> (#i)x
(case-sensitive)~(N)x
-> x(N)
(nullglob, berasal dari zsh){1,5}(x)
-> x(#c1,5)
@(foo&bar)
-> foo~^bar
atau^(^foo|^bar)
Beberapa hanya ditemukan di zsh
:
<1-23>
(rentang angka desimal)pattern~except
pattern(glob-qualifier)
(fitur pembunuh dari gumpalan zsh)(pattern/)#
(setiap tingkat subdirektori yang cocok dengan pattern
; **/
versi disederhanakan (*/)#
juga ditambahkan ke ksh93 dan bash baru-baru ini)***/*
(globung rekursif berikut symlinks).(#a1)foobar
(perkiraan pencocokan, memungkinkan beberapa kesalahan, di sini 1)