代わりに何をしたいですか?rmまったく実行されません(1)?*他のBourneのようなシェル(2)のようなリテラル引数で実行しますか?引数なしで実行します(3)?
files=(*(N)); (($#files)) && rm -- $files。または(rm -- *) 2> /dev/null、それはまたrm、愚かなことになる本物のエラーを隠します。あなたはzshエラーを捨てることができますが、rmコマンドのstderrを復元します(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
emulate sh -c 'rm -- *' 2> /dev/null。ように続いてshいるzsh今、その単一のコマンドライン用のエミュレートされ、非マッチングは*にそのまま渡されるrmと、rmそのよう文句*ファイルが存在しません。私たちは抑制rmあなたが行うようの標準エラー出力をshエラーメッセージことを抑制するためには、それが本物でエラーを非表示と同じように、再び、それは愚かだrmの不正行為によって生じた誤差とは対照的に、shリテラル渡し*にしますrm。rm -f '*'存在しない*ファイルについて文句を言うことはありませんが、そうすることができますemulate sh -c 'rm -f -- *'
rm -- *(N)。rm、しかし、再び、任意の引数を渡されていないときではないが文句を言うでしょうrm -f:rm -f -- *(N)。
一般に、rm -fすべてのファイルを削除し、ファイルを削除できなかった場合、またはIOWがrm戻った後もIOWが残っている場合にのみエラーを取得する場合に使用するコマンドです。また、通常-f、スクリプトで使用して、特定の状況でユーザーにプロンプトが出されないようにします。
ここでrmは、グロブが一致しないときに呼び出すのは間違っています。sh1つの行動が間違っています。それはのようなパターンのために無害だ*が、同様に1つずつ*.[ch]渡し、*.[ch]それが引き起こす可能性が一致しない場合されて、*.[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
エラーで失敗すると行うための最も賢明なことで、何でzsh(とfish、csh、tcsh、bash -o failglob、オリジナルのUnixシェル)ありません。
そして、あなたがその特別なケースに気をつけたいなら、上記のケース(1)のように、zshその(N)glob修飾子(noglob)で簡単にします。fish(少なくとも最近のバージョンでは)コマンドに対して暗黙的なnoglobを実行するため、さらに簡単になりsetます。したがって、そこに相当するものは次のようになります。
set files *
if count $files > /dev/null
rm -f -- $files
end
詳細については、nullglobがデフォルトではない理由を参照してください。
1。厳密に言えば、それshはBourneシェル(1979年のUnix V7以降)以来です。sh(グロブ名が由来/etc/globする引用符で囲まれていないワイルドカードを呼び出す)の以前のバージョンは、またはのように動作しました。それらの1つに一致がありました)。この動作は、Bourneシェルによって壊れていました。cshzsh -o cshnullglob/etc/glob