ハイフンで始まるファイルがあるときに「rm *」が機能しないのはなぜですか?

ハイフンで始まるファイルがあるときに「rm *」が機能しないのはなぜですか?

から:http://seclists.org/fulldisclosure/2011/Sep/190

[USER@MACHINE ~] mkdir ejha
[USER@MACHINE ~] cd ejha/
[USER@MACHINE ~/ejha] touch ize
[USER@MACHINE ~/ejha] touch -- -f -i
[USER@MACHINE ~/ejha] ls -l
total 0
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -f
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -i
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 ize
[USER@MACHINE ~/ejha] rm *
rm: remove regular empty file `ize'? y
[USER@MACHINE ~/ejha] ls -l
total 0
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -f
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -i
[USER@MACHINE ~/ejha] 

システムに関する情報:

[USER@MACHINE ~/ejha] echo $SHELL
/bin/bash
[USER@MACHINE ~/ejha] lsb_release -a
LSB Version:    :core-4.0-ia32:core-4.0-noarch
Distributor ID: Fedora
Description:    Fedora release 14 (Laughlin)
Release:    14
Codename:   Laughlin
[USER@MACHINE ~/ejha] rpm -qa | fgrep bash
bash-4.1.7-4.fc14.i686
[USER@MACHINE ~/ejha] 

なぜ? 「-f」ファイルと「-i」ファイルを削除しないのはなぜですか?

答え1

ファイル名はパラメータ(引用符なしでこの場合は*拡張されます-f -i ize)として認識されるため、削除しません。これらのファイルを削除するには、rm -- *またはを実行しますrm ./*--パラメータの終わりを表示し、./現在のディレクトリへのリンクを使用してrmパラメータ検出をバイパスします。

一部のプログラムでは、ストップチェック引数を./*受け入れないため、しばしば優先されます。--

これは間違いではありません。rmこれらの問題を回避するには、正しい方法で呼び出して処理する必要があります。

答え2

少し明確にするために、 "*"は "rm"ではなくシェルによって拡張されるため、 "rm"コマンドはファイルのリストを引数として取得します。したがって、あなたの例では、「rm *」は「rm -f -i ize」と入力するのとまったく同じです。

他のシステム(たとえば、Windows / DOSコマンドライン)では、「*」はコマンド自体を介してファイルのリストに展開されるため、コマンドは一致するすべてのファイルがファイルであることを「認識」します。このアプローチの欠点は、各コマンドがワイルドカードを実装し、ワイルドカードの構成や引用規則などを再実装する必要があることです。

関連情報