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 failglobopsi 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 lstanpa argumen, jadi daftar direktori saat ini. cshnullgloblebih 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 bashyang akan memalukan.
Untuk alternatif gumpalan yang bekerja di keduanya zshdan bash, Anda bisa menggunakan gumpalan ksh ( set -o kshglobdalam zshdan shopt -s extglobdalam bash).
Maka, Anda akan melakukan:
ls -d ./foldername/*.@(a|b|)test
atau:
ls -d ./foldername/*.?([ab])test
Tambahkan failglobopsi bashuntuk menghindari gumpalan diteruskan secara harfiah ke lssaat tidak cocok.
Lihat Mengapa nullglob tidak default? untuk informasi lebih lanjut.
/dev/null?