web-dev-qa-db-ja.com

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

差出人: http://seclists.org/fulldisclosure/2011/Sep/19

[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」ファイルを削除しないのはなぜですか?

5
LanceBaynes

ファイル名を引数として認識するため、削除されません(引用符で囲まれていない場合、この状況では*-f -i izeに展開されます)。これらのファイルを削除するには、rm -- *またはrm ./*を実行します。 --は引数の終わりを示し、./は現在のディレクトリへのリンクを使用してrmの引数の検出を回避します。

一部のプログラムは引数のチェックを停止するために./*を受け入れないため、通常は--が推奨されます。

これはバグではありません。これは、このような問題を回避するために、正しい方法でrmを呼び出すことによって処理する必要があるものです。

16
Chris Down

少しわかりやすくするために、「*」は「rm」ではなくシェルによって展開されているため、「rm」コマンドはファイルのリストを引数として取得するだけです。したがって、この例では、「rm *」は「rm-f-iize」と入力するのとまったく同じです。

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

4
P.T.