Di
ls -d ./foldername/*.{a,b,}test
{a,b,...}
bukan operator glob, itu penjepit ekspansi, yang pertama kali diperluas ke:
ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test
Dan setiap bola berkembang secara individual, dan jika ada bola yang tidak cocok, perintah dibatalkan seperti yang Anda harapkan di zsh
(atau fish
; di bash
, Anda membutuhkan failglob
opsi untuk mendapatkan perilaku yang sama).
Di sini, Anda ingin menggunakan satu bola yang cocok dengan semua file itu, dan hanya membatalkan perintah jika bola itu tidak cocok dengan file apa pun:
ls -d ./foldername/*.(a|b|)test
Anda tidak ingin menggunakan nullglob
, seolah-olah tidak ada gumpalan yang cocok, itu akan berjalan ls
tanpa argumen, jadi daftar direktori saat ini. cshnullglob
lebih baik dalam hal itu karena menghapus gumpalan yang tidak cocok tetapi masih membatalkan perintah jika semua gumpalan gagal untuk mencocokkan.
Anda tidak akan mau menggunakan nonomatch
, karena itu akan memberi Anda perilaku yang rusak bash
yang akan memalukan.
Untuk alternatif gumpalan yang bekerja di keduanya zsh
dan bash
, Anda bisa menggunakan gumpalan ksh ( set -o kshglob
dalam zsh
dan shopt -s extglob
dalam bash
).
Maka, Anda akan melakukan:
ls -d ./foldername/*.@(a|b|)test
atau:
ls -d ./foldername/*.?([ab])test
Tambahkan failglob
opsi bash
untuk menghindari gumpalan diteruskan secara harfiah ke ls
saat tidak cocok.
Lihat Mengapa nullglob tidak default? untuk informasi lebih lanjut.
/dev/null
?