代わりに何をしたいですか?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
は、グロブが一致しないときに呼び出すのは間違っています。sh
1つの行動が間違っています。それはのようなパターンのために無害だ*
が、同様に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シェルによって壊れていました。csh
zsh -o cshnullglob
/etc/glob