背景
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
オプションによってエラーメッセージが出力されないため、原因の特定は困難になる。そもそも可能性が考えられる時点で安全な./*
を用いるべきなのだろう。