背景
Shell Style Guideを読んでいたらワイルドカードについて書いてあった。そこで初めて知ったことがあったので自己の戒めを兼ねて書く。
概要
Shell Style Guideによるとファイル名は-から始められるから*ではなく./*の方が安全と書いてある。検証してみる。検証環境はbash-3.2。
検証
まずテキストファイルa.txtとディレクトリa_dirを作成して$ rm *コマンドを実行する。するとa.txtは削除されるが、a_dirはrm: a_dir/: is a directoryと出て削除できない。ここまでは納得。
次にファイル-f、-r、a.txt、ディレクトリa_dirを作成する。ここでも$ rm a_dirコマンドはrm: a_dir/: is a directoryと出る。さて、ここで*コマンドを実行してみる。すると…

本来消えるはずのないディレクトリa_dirが削除されてしまっている。念のためechoコマンドで確かめてみる。

考察
ワイルドカードは当該ディレクトリ内のファイルおよびディレクトリを全て展開しているだけだった。そのため、-fと-rファイルがオプションとして解釈されてしまっていた。-rはディレクトリも削除対象に含むオプションであり、これによってa_dirも削除対象となっていた。
「そんなシチュエーションないだろ」という考えもあると思うが、複雑なバッチ処理の最中にこれに似た処理が走る可能性もあるかもしれない。その際もしも何らかの原因でエラーが発生したとしても-fオプションによってエラーメッセージが出力されないため、原因の特定は困難になる。そもそも可能性が考えられる時点で安全な./*を用いるべきなのだろう。