Bunun yerine ne yapmasını isterdiniz? Hiç çalıştırılmıyor rmmu (1)? *Bourne benzeri diğer mermilerde olduğu gibi gerçek bir argümanla mı çalışıyorsunuz (2)? Hiç argüman olmadan mı (3)?
files=(*(N)); (($#files)) && rm -- $files. Ya (rm -- *) 2> /dev/nullda rmbu saçma olacak gerçek hataları da gizlerdi. zshHatayı atabilir, ancak rmkomut için stderr'ı geri yükleyebilirsiniz.(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
emulate sh -c 'rm -- *' 2> /dev/null. Daha sonra , bu tek komut satırı için şimdi taklit shedildiği gibi, zsheşleşmeyenlik *olduğu gibi iletilir rmve rmbu *dosya olmadığı için şikayet eder . Biz bastırmak rmİçinde yapacağı gibi 'ın stderr'yi shbastırmak için bu hata mesajı, ama yine, tarafından hakiki hataları gizlemek gibi saçma olduğunu rmdoğması uğradıkları hata aksine shbir hazır geçirerek *için rm. rm -f '*'mevcut olmayan bir *dosyadan şikayetçi olmaz.emulate sh -c 'rm -f -- *'
rm -- *(N). rmyine de herhangi bir argümanı geçmediğinde şikayet ederdi, yine rm -f: değil rm -f -- *(N).
Genellikle, rm -ftüm dosyaların gitmesini ve yalnızca dosyaların kaldırılamaması veya IOW rmdöndükten sonra hala orada olması durumunda hata almak istiyorsanız kullanmak istediğiniz komuttur . Ayrıca genellikle-f , bazı durumlarda kullanıcıya sorulmasını önlemek için komut dosyalarında .
Burada, rmglob eşleşmediğinde aramak yanlıştır. sh1 davranış yanlıştır. Gibi bir desen için zararsızdır *, ancak benzer bir şekilde eşleşmediğinde olduğu gibi *.[ch]geçmek dosyanın yanlışlıkla kaldırılmasına *.[ch]neden olabilir *.[ch]:
$ 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
Bir hata ile başarısız yapılacak en mantıklı şeydir ve ne olduğunu zsh(ve fish, csh, tcsh,bash -o failglob ve orijinal Unix kabuk) yapar.
Ve bu özel durumla ilgilenmek istiyorsanız, yukarıdaki (1) örneğinde olduğu gibi glob niteleyicisi ( noglob için ) zshile kolaylaştırır . (en azından son sürümde ) , komut için örtük bir noglob yaptığı için bunu daha da kolaylaştırır . Yani, orada eşdeğer:(N)fishset
set files *
if count $files > /dev/null
rm -f -- $files
end
Daha fazla bilgi için bkz. Nullglob neden varsayılan değil .
1 . Açıkçası sadece shBourne kabuğundan beri (1979'da Unix V7'den beri); önceki sürümleri sh(çağrı yaptılar /etc/globnerede olduğu tırnaksız joker karakterler üzerine glob adı geliyor) gibi davranacaksan yaptılar cshya zsh -o cshnullglobolduğu, /etc/globNeználkovo hiçbiri maçı olsaydı komutu iptal olur (ve en azından eğer eşleşmeyen globs bastırmak istiyorum birinin herhangi bir eşleşmesi vardı). Davranış Bourne kabuğu tarafından kırıldı .