Apa yang ingin Anda lakukan? Tidak berjalan rm
sama 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/null
tapi itu juga akan menyembunyikan kesalahan asli rm
yang konyol. Anda bisa membuang zsh
kesalahan tetapi mengembalikan stderr untuk rm
perintah dengan(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
emulate sh -c 'rm -- *' 2> /dev/null
. Kemudian seperti sh
yang zsh
sekarang ditiru untuk baris perintah tunggal, yang tidak cocok *
diteruskan apa adanya rm
dan rm
mengeluh karena *
file itu tidak ada. Kami menekan rm
stderr seperti yang Anda lakukan sh
untuk menekan pesan kesalahan itu, tetapi sekali lagi, itu konyol karena akan menyembunyikan kesalahan asli dengan rm
bertentangan dengan kesalahan yang ditimbulkan oleh kelakuan buruk dari sh
menyampaikan literal *
ke rm
. rm -f '*'
tidak akan mengeluh tentang *
file yang tidak ada , jadi Anda bisa melakukannyaemulate sh -c 'rm -f -- *'
rm -- *(N)
. rm
akan mengeluh meskipun ketika tidak lulus argumen, meskipun lagi, tidak rm -f
: rm -f -- *(N)
.
Secara umum, rm -f
adalah 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 rm
kembali. Anda juga umumnya ingin menggunakan -f
skrip untuk menghindari pengguna diminta dalam beberapa situasi.
Di sini, menelepon rm
saat glob tidak cocok adalah salah. The sh
1 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 failglob
dan yang asli Unix shell) tidak.
Dan jika Anda ingin menjaga diri Anda sendiri dari kasus khusus itu, zsh
membuatnya 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 set
perintah. 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 sh
sejak shell Bourne (sejak Unix V7 pada 1979); versi sebelumnya dari sh
(yang memang memanggil /etc/glob
wildcard yang tidak dikutip dari mana nama glob berasal) berperilaku seperti csh
atau zsh -o cshnullglob
, yaitu /etc/glob
akan 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.