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/nullaber das würde auch echte Irrtümer verbergen, rmdie albern wären. Sie könnten den zshFehler verwerfen , aber stderr für den rmBefehl mit wiederherstellen(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
emulate sh -c 'rm -- *' 2> /dev/null. Dann wird, wie in dem Beispiel, shdas zshjetzt für diese einzelne Befehlszeile emuliert wurde, die Nichtübereinstimmung so *wie sie ist an übergeben rmund rmbeschwert 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 rmim 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). rmobwohl 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 rmder Rückkehr noch vorhanden ist. Sie möchten -fim Allgemeinen auch in Skripten verwenden, um zu vermeiden, dass der Benutzer in bestimmten Situationen dazu aufgefordert wird.
Hier ist das Aufrufen, rmwenn der Glob nicht übereinstimmt, falsch. Das sh1- 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 failglobund der ursprünglich Unix - Shell) der Fall ist.
Und wenn Sie sich um diesen speziellen Fall kümmern möchten, zshmachen 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 setBefehl . 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 shseit der Bourne-Shell (seit Unix V7 im Jahr 1979); frühere Versionen von sh(die nicht /etc/globzitierte Platzhalter verwendeten, von denen der Glob- Name stammt) verhielten sich wie cshoder zsh -o cshnullglob, /etc/globdh 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 .