-r というファイルを削除したい、みたいな話です。
基本
- コマンドの引数に
--が現れたら、それ以降は-から始まる列でもオプションとして解釈しなくなります - ハイフンから始まるものがファイル名なら、パスを
./-hogeと指定すればハイフンから始まらずに済みます
失敗する例
% echo hoge > -r
% ls
-r
% rm -r
rm: missing operand
Try 'rm --help' for more information.
この通り、ハイフンから始まる〇〇を何も考えずに扱うと、図らずもオプションとして解釈されて残念な結果になります。
-- 以降はオプションにならない
% ls
-r
% rm -- -r
% ls
-- を前置してやれば、それ以降はオプションとして解釈されず、意図した動きをしてくれます。
- が先頭に来ないように工夫する
% ls
-r
% rm ./-r
% ls
そもそもパス名なら、./ を明示して相対パス指定すればハイフン始まりにならないので、そう書き換えるのも有効です。
両方とも知っておかないといけないという話
上に示したふたつの方式は、実は使い分けが必要な場合があります。
- ディレクトリに cd したい
これは、「ハイフンから始まる」とは厳密には違う話ですが。
cd コマンドには、cd - で直前のディレクトリに戻るという機能があります。なので、- というディレクトリに何も考えずに移動しようとすると、
% pwd
/Users/hmwakasa/test
% mkdir test3
% cd test3
% mkdir -- -
% ls -F
-/
% cd -
~/test
% pwd
/Users/hmwakasa/test
移動できません。こういうときは ./ を明示した相対パスで指定するとよいです。
% ls -F
-/
% cd ./-
% pwd
/Users/hmwakasa/test/test3/-
cd - は何かオプションを指定しているわけではないので、-- 前置では解決できません。
- から始まる文字列を grep したい
./ 明示指定法で歯が立たないものがあります。それは、- から始まるものがパスではない場合です。具体的には、- から始まる文字列を grep する場合です。
grep のヘルプメッセージから、-P オプションの意味を検索したいとします。
% grep --help | grep -F -P
grep: conflicting matchers specified
こういうときは -- 前置するしかありません。
% grep --help | grep -F -- -P
-P, --perl-regexp PATTERNS are Perl regular expressions
まとめ
最後の grep の例はともかく、そもそも記号から始まるファイルは作らないようにしよう。