Was soll es stattdessen tun? Überhaupt nicht ausgeführt rm
(1)? Führen Sie es mit einem wörtlichen *
Argument wie in anderen Bourne-ähnlichen Shells aus (2)? Führen Sie es ohne Argumente aus (3)?
files=(*(N)); (($#files)) && rm -- $files
. Oder (rm -- *) 2> /dev/null
aber das würde auch echte Irrtümer verbergen, rm
die albern wären. Sie könnten den zsh
Fehler verwerfen , aber stderr für den rm
Befehl mit wiederherstellen(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
emulate sh -c 'rm -- *' 2> /dev/null
. Dann wird, wie in dem Beispiel, sh
das zsh
jetzt für diese einzelne Befehlszeile emuliert wurde, die Nichtübereinstimmung so *
wie sie ist an übergeben rm
und rm
beschwert sich, da diese *
Datei nicht vorhanden ist. Wir unterdrücken rm
's stderr, wie Sie es tun würden sh
, um diese Fehlermeldung zu unterdrücken, aber das ist auch albern, da es echte Fehler rm
im Gegensatz zu dem Fehler, der durch das Fehlverhalten beim sh
Übergeben eines Literal *
an entsteht, verbergen würde rm
. rm -f '*'
Ich würde *
mich jedoch nicht über eine nicht vorhandene Datei beschweren , also könnten Sie dies tunemulate sh -c 'rm -f -- *'
rm -- *(N)
. rm
obwohl würden sich beschweren , wenn kein Argument übergeben, obwohl auch hier nicht rm -f
: rm -f -- *(N)
.
Allgemein, rm -f
ist der Befehl, den Sie verwenden möchten, wenn alle Dateien gelöscht werden sollen und nur dann eine Fehlermeldung angezeigt wird, wenn Dateien nicht entfernt werden konnten oder IOW nach rm
der Rückkehr noch vorhanden ist. Sie möchten -f
im Allgemeinen auch in Skripten verwenden, um zu vermeiden, dass der Benutzer in bestimmten Situationen dazu aufgefordert wird.
Hier ist das Aufrufen, rm
wenn der Glob nicht übereinstimmt, falsch. Das sh
1- Verhalten ist falsch. Es ist harmlos für ein Muster wie *
, aber für eines wie*.[ch]
vorbei , *.[ch]
wie sie ist , wenn sie nicht dazu führen , übereinstimmen könnten die*.[ch]
- Datei versehentlich entfernt werden:
$ 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
Mit einem Fehler zu scheitern, ist das sinnvollste und das, was zu tun ist zsh
(und fish
, csh
, tcsh
, bash -o failglob
und der ursprünglich Unix - Shell) der Fall ist.
Und wenn Sie sich um diesen speziellen Fall kümmern möchten, zsh
machen Sie es sich mit dem (N)
Glob-Qualifier (für noglob ) wie in Fall (1) oben leicht . fish
(zumindest in der neuesten Version ) macht es noch einfacher, als es ein implizites tut Noglob tut für den set
Befehl . Das Äquivalent wäre also:
set files *
if count $files > /dev/null
rm -f -- $files
end
Sehen Warum ist nullglob nicht Standard? .
1 . Genau genommen ist es erst sh
seit der Bourne-Shell (seit Unix V7 im Jahr 1979); frühere Versionen von sh
(die nicht /etc/glob
zitierte Platzhalter verwendeten, von denen der Glob- Name stammt) verhielten sich wie csh
oder zsh -o cshnullglob
, /etc/glob
dh sie brachen den Befehl ab, wenn keiner der Globs übereinstimmte (und unterdrückten die nicht übereinstimmenden Globs, wenn zumindest einer von ihnen hatte ein Streichholz). Das Verhalten wurde von der Bourne-Shell unterbrochen .