Apa yang ingin Anda lakukan? Tidak berjalan rmsama sekali (1)? Jalankan dengan *argumen literal seperti di shell Bourne-like lainnya (2)? Jalankan tanpa argumen sama sekali (3)?
files=(*(N)); (($#files)) && rm -- $files. Atau (rm -- *) 2> /dev/nulltapi itu juga akan menyembunyikan kesalahan asli rmyang konyol. Anda bisa membuang zshkesalahan tetapi mengembalikan stderr untuk rmperintah dengan(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
emulate sh -c 'rm -- *' 2> /dev/null. Kemudian seperti shyang zshsekarang ditiru untuk baris perintah tunggal, yang tidak cocok *diteruskan apa adanya rmdan rmmengeluh karena *file itu tidak ada. Kami menekan rmstderr seperti yang Anda lakukan shuntuk menekan pesan kesalahan itu, tetapi sekali lagi, itu konyol karena akan menyembunyikan kesalahan asli dengan rmbertentangan dengan kesalahan yang ditimbulkan oleh kelakuan buruk dari shmenyampaikan literal *ke rm. rm -f '*'tidak akan mengeluh tentang *file yang tidak ada , jadi Anda bisa melakukannyaemulate sh -c 'rm -f -- *'
rm -- *(N). rmakan mengeluh meskipun ketika tidak lulus argumen, meskipun lagi, tidak rm -f: rm -f -- *(N).
Secara umum, rm -fadalah perintah yang ingin Anda gunakan jika Anda ingin semua file hilang dan hanya mendapatkan kesalahan jika file tidak dapat dihapus atau TKI masih ada setelah rmkembali. Anda juga umumnya ingin menggunakan -fskrip untuk menghindari pengguna diminta dalam beberapa situasi.
Di sini, menelepon rmsaat glob tidak cocok adalah salah. The sh1 perilaku yang salah. Ini tidak berbahaya untuk pola seperti *, tetapi untuk yang seperti *.[ch], melewati *.[ch]apa adanya ketika tidak cocok dapat menyebabkan *.[ch]file dihapus secara tidak sengaja:
$ ls
*.[ch] foo.txt
$ zsh -c 'rm *.[ch]'
zsh:1: no matches found: *.[ch]
$ ls
*.[ch] foo.txt
$ sh -c 'rm *.[ch]'
$ ls
foo.txt
Gagal dengan kesalahan adalah hal yang masuk akal yang paling harus dilakukan dan apa zsh(dan fish, csh, tcsh, bash -o failglobdan yang asli Unix shell) tidak.
Dan jika Anda ingin menjaga diri Anda sendiri dari kasus khusus itu, zshmembuatnya mudah dengan (N)kualifikasi glob (untuk noglob ) seperti dalam kasus (1) di atas. fish(setidaknya dalam versi terbaru ) membuatnya lebih mudah karena ia melakukan noglob implisit untuk setperintah. Jadi, yang setara di sana, adalah:
set files *
if count $files > /dev/null
rm -f -- $files
end
Lihat Mengapa nullglob tidak default untuk detail lebih lanjut.
1 . Sebenarnya itu baru shsejak shell Bourne (sejak Unix V7 pada 1979); versi sebelumnya dari sh(yang memang memanggil /etc/globwildcard yang tidak dikutip dari mana nama glob berasal) berperilaku seperti cshatau zsh -o cshnullglob, yaitu /etc/globakan membatalkan perintah jika tidak ada gumpalan yang cocok (dan akan menekan gumpalan yang tidak cocok jika setidaknya salah satu dari mereka punya kecocokan). Perilaku itu rusak oleh kulit Bourne.