Bunun yerine ne yapmasını isterdiniz? Hiç çalıştırılmıyor rm
mu (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/null
da rm
bu saçma olacak gerçek hataları da gizlerdi. zsh
Hatayı atabilir, ancak rm
komut 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 sh
edildiği gibi, zsh
eşleşmeyenlik *
olduğu gibi iletilir rm
ve rm
bu *
dosya olmadığı için şikayet eder . Biz bastırmak rm
İçinde yapacağı gibi 'ın stderr'yi sh
bastırmak için bu hata mesajı, ama yine, tarafından hakiki hataları gizlemek gibi saçma olduğunu rm
doğması uğradıkları hata aksine sh
bir hazır geçirerek *
için rm
. rm -f '*'
mevcut olmayan bir *
dosyadan şikayetçi olmaz.emulate sh -c 'rm -f -- *'
rm -- *(N)
. rm
yine de herhangi bir argümanı geçmediğinde şikayet ederdi, yine rm -f
: değil rm -f -- *(N)
.
Genellikle, rm -f
tüm dosyaların gitmesini ve yalnızca dosyaların kaldırılamaması veya IOW rm
dö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, rm
glob eşleşmediğinde aramak yanlıştır. sh
1 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 ) zsh
ile 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)
fish
set
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 sh
Bourne kabuğundan beri (1979'da Unix V7'den beri); önceki sürümleri sh
(çağrı yaptılar /etc/glob
nerede olduğu tırnaksız joker karakterler üzerine glob adı geliyor) gibi davranacaksan yaptılar csh
ya zsh -o cshnullglob
olduğu, /etc/glob
Nezná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ı .